面向对象三大特性(封装、继承、多态)
2017-11-05 15:29
330 查看
一、封装
1. 修饰符:
public :公开的、公共的
private:私有的,被private修饰的属性只能在本类中使用。
2. 封装的要求:
a. 将属性私有化:private
b. 对私有的属性提供公开的get/set方法:
获取属性值: get属性名() --->属性名的首字母大写
public int getAge(){
return this.age;//age
}
设置属性的值:set属性名(形参) ----》属性名的首字母大写
public void setAge(int age){
this.age=age;
}
c. 使用
获取属性数据:s1.getAge();
为属性赋值: s1.setAge(12);
二、继承
水杯 是一种 容器
碳素笔 是一种 笔
狗 是一种 动物
A is-a B
1. 概念:【理解】
① 继承体现的是类之间的"is-a"关系。
A is a B
A 继承 B ====> A 是子类;B是父类
② 继承是一种机制,通过这种机制可以让子类使用父类中的属性和方法。
③ 继承不能强制使用,继承是本身存在一种"is-a"关系,不是人为、
刻意创造。
2. 继承的好处:
体现代码的可复用行、扩展性。
3. 方法的覆盖(override/重写)【面试+开发重点】
① 概念:子类中定义了和父类相同的方法。
② 要求:
a. 子类中方法名、形参列表、返回值类型和父类相同
b. 子类中的访问修饰符合父类相同或是比父类更宽。
③ 使用:子类引用.方法名(实参);//子类中的方法优先被调用
④ 注意:
a. 方法名、形参列表一样,返回值不同,这种情况下编译报错。
b. 方法名、返回值类型一样;参数列表不同,这种情况下编译、运行
都可以,是一种重载。
⑤ 应用场景:当父类中的方法无法满足子类的需求时,子类覆盖父类中的方法。
4. 父类是子类的共性抽取。【理解】
父类中的信息是一般的、抽象的;
子类中的信息是特殊的、具体的。
5. Java的继承特点:【理解+面试重点】
Java中的类之间是单继承关系,即一个类只能有有一个直接的父类;
但是可以采用多级继承,即可以有多个间接父类。
6. 子类可以继承父类中那些哪容???【理解+面试重点】
① 构造方法不能被继承。
原因:a. 构造方法的方法名必须和类名一致;
b. 子类中有更多的属性和方法,所有构造过程相对复杂,
所以父类的构造方法不足以满足子类,所以子类必须
定义自己的构造方法。
② 属性/成员方法取决于访问修饰符。
本类 同包 不同包的子类 其他(不同包下的非子类)
private :私有的 OK
[default]:默认的 OK OK
protected:受保护的 OK OK OK
public : 公开的 OK OK OK OK
注意:a. 4 个访问修饰符都可以修饰属性、成员方法、构造方法
b. 只有public / default可以修饰类
总结:
继承(属性/成员方法)
private(私有的)
不能被继承
[default](默认的) 同包子类可以继承
protected(受保护的) 可以被继承
public (公开的) 可以被继承
7. 对象的创建过程:【理解】
① 分配空间(子类+所有的父类):给属性赋默认值
② 递归的构造父类对象(初始化父类属性--》调用父类的构造方法)
③ 初始化子类的属性
④ 调用子类的构造方法
8. super的应用【开发应用重点】
① 第一种用法:super()
super()/super(实参):用在子类的构造方法中,代表创建子类
对象时,先去创建父类对象,指定创建父类对象时调用父类
的哪一个构造方法。
注意:a.super()用在构造方法中第一行有效语句。
b.如果构造方法中第一行没有super()/super(实参)/this()
JVM会默认添加一个super();
c. 一个构造方法中 this()/this(实参)不能和
super()/super(实参)同时应用。
d. 如果构造方法的第一行是this()/this(实参),JVM会放弃在
当前构造方法中查找super,从而转向this()所指向的构造方
法去查找super().
② super的第二种用法:super.
super.属性 /super.方法名(实参):代表在子类中调用父类中的属性或是成员方法;
注意: super. 可以用在子类中的成员方法、构造方法中。
super.属性名 :代表访问父类中属性
super.方法名(实参):代表访问父类中成员方法
eg:
package demo20171030;
/**
* 员工薪资
*
*
*/
public class Question_06 {
public static void main(String[] args) {
Employee[] em = { new SalariedEmployee("张一", 6, 1000), new HourlyEmployee("张二", 6, 12, 2000),
new SalesEmployee("张三", 6, 30000, 0.5), new BasePlusSalesEmployee("张四", 6, 40000, 0.5, 2000) };
// 强转
SalariedEmployee sa = (SalariedEmployee) em[0];
HourlyEmployee ho = (HourlyEmployee) em[1];
SalesEmployee sal = (SalesEmployee) em[2];
BasePlusSalesEmployee ba = (BasePlusSalesEmployee) em[3];
// SalariedEmployee sa = new SalariedEmployee("张一", 6, 1000);
System.out.println("~~~~~~~~~~~~~~~~~~张一的基本信息和薪资~~~~~~~~~~~~~~~~~~");
System.out.println("姓名:" + sa.getName() + "\n" + "出生月份:" + sa.getMonth() + "月" + "\n" + "薪资:" + sa.getSalary(10)+"\n"+"加班费:"+sa.jiaBan());
// HourlyEmployee ho = new HourlyEmployee("张二", 6, 12, 2000);
System.out.println("~~~~~~~~~~~~~~~~~~张二的基本信息和薪资~~~~~~~~~~~~~~~~~~");
System.out.println("姓名:" + ho.getName() + "\n" + "出生月份:" + ho.getMonth() + "月" + "\n" + "工作小时:" + ho.getHours()+ "小时" + "\n" + "薪资:" + ho.getSalary(10));
// SalesEmployee sal = new SalesEmployee("张三", 6, 30000, 0.5);
System.out.println("~~~~~~~~~~~~~~~~~~张三的基本信息和薪资~~~~~~~~~~~~~~~~~~");
System.out.println("姓名:" + sal.getName() + "\n" + "出生月份:" + sal.getMonth() + "月" + "\n" + "月销售额:"+ sal.get
b75b
Sales() + "\n" + "提成率:" + sal.getRate() + "\n" + "薪资:" + sal.getSalary(10));
// BasePlusSalesEmployee ba = new BasePlusSalesEmployee("张四", 6, 40000,// 0.5, 2000);
System.out.println("~~~~~~~~~~~~~~~~~~张四的基本信息和薪资~~~~~~~~~~~~~~~~~~");
System.out.println("姓名:" + ba.getName() + "\n" + "出生月份:" + ba.getMonth() + "月" + "\n" + "月销售额:" + ba.getSales()+ "\n" + "提成率:" + ba.getRate() + "\n" + "底薪:" + ba.getBaseSalary() + "\n" + "薪资:" + ba.getSalary(10)+"\n"+"加班费:"+ba.jiaBan());
System.out.println("~~~~~~~~~~~~~~~~~~本月公司总共发放的加班费~~~~~~~~~~~~~~~~~~");
System.out.println("总计:"+(sa.jiaBan()+ba.jiaBan())+"元");
}
}
// 员工
class Employee {
private String name;
private int month;
// 构造方法
public Employee() {
}
public Employee(String name, int month) {
this.name = name;
this.month = month;
}
public void setName(String name) {
this.name = name;
}
public String getName() {
return this.name;
}
public void setMonth(int month) {
this.month = month;
}
public int getMonth() {
return this.month;
}
// 判断员工是否过生日
public double getSalary(int month) {
if (month == this.month) {
return 100;
} else {
return 0;
}
}
}
// 固定工资
class SalariedEmployee extends Employee implements JiaBanfei{
private double salary;
public SalariedEmployee() {
}
public SalariedEmployee(double salary) {
this.salary = salary;
}
public SalariedEmployee(String name, int month, double salary) {
super(name, month);
this.salary = salary;
}
public double getSalary() {
return salary;
}
public void setSalary(double salary) {
this.salary = salary;
}
public double getSalary(int month) {
return this.salary + super.getSalary(month);
}
public double jiaBan() {
return 2000;
}
}
// 按小时
class HourlyEmployee extends Employee {
private int hours;
private double hourlySalary;
public HourlyEmployee() {
}
public HourlyEmployee(String name, int month, int hours, double hourlySalary) {
super(name, month);
this.hours = hours;
this.hourlySalary = hourlySalary;
}
public int getHours() {
return hours;
}
public void setHours(int hours) {
this.hours = hours;
}
public double getHourlySalary() {
return hourlySalary;
}
public void setHourlySalary(double hourlySalary) {
this.hourlySalary = hourlySalary;
}
public double getSalary(int month) {
double dd;
if (hours > 160) {
dd = (hours - 160) * 1.5 * hourlySalary + 160 * hourlySalary;
} else {
dd = hours * hourlySalary;
}
return dd + super.getSalary(month);
}
}
// 销售人员
class SalesEmployee extends Employee {
private double sales;
private double rate;
public SalesEmployee() {
}
public SalesEmployee(String name, int month, double sales, double rate) {
super(name, month);
this.sales = sales;
this.rate = rate;
}
public double getSales() {
return sales;
}
public void setSales(double sales) {
this.sales = sales;
}
public double getRate() {
return rate;
}
public void setRate(double rate) {
this.rate = rate;
}
public double getSalary(int month) {
return this.sales * this.rate + super.getSalary(month);
}
}
// 有固定底薪的
class BasePlusSalesEmployee extends SalesEmployee implements JiaBanfei{
private double baseSalary;
public BasePlusSalesEmployee() {
}
public BasePlusSalesEmployee(String name, int month, double sales, double rate, double baseSalary) {
super(name, month, sales, rate);
this.baseSalary = baseSalary;
}
public double getBaseSalary() {
return baseSalary;
}
public void setBaseSalary(double baseSalary) {
this.baseSalary = baseSalary;
}
public double getSalary(int month) {
return this.baseSalary + super.getSalary(month);
}
public double jiaBan() {
return 1000;
}
}
interface JiaBanfei{ //定义一个接口
public abstract double jiaBan();
}
1. 修饰符:
public :公开的、公共的
private:私有的,被private修饰的属性只能在本类中使用。
2. 封装的要求:
a. 将属性私有化:private
b. 对私有的属性提供公开的get/set方法:
获取属性值: get属性名() --->属性名的首字母大写
public int getAge(){
return this.age;//age
}
设置属性的值:set属性名(形参) ----》属性名的首字母大写
public void setAge(int age){
this.age=age;
}
c. 使用
获取属性数据:s1.getAge();
为属性赋值: s1.setAge(12);
二、继承
水杯 是一种 容器
碳素笔 是一种 笔
狗 是一种 动物
A is-a B
1. 概念:【理解】
① 继承体现的是类之间的"is-a"关系。
A is a B
A 继承 B ====> A 是子类;B是父类
② 继承是一种机制,通过这种机制可以让子类使用父类中的属性和方法。
③ 继承不能强制使用,继承是本身存在一种"is-a"关系,不是人为、
刻意创造。
2. 继承的好处:
体现代码的可复用行、扩展性。
3. 方法的覆盖(override/重写)【面试+开发重点】
① 概念:子类中定义了和父类相同的方法。
② 要求:
a. 子类中方法名、形参列表、返回值类型和父类相同
b. 子类中的访问修饰符合父类相同或是比父类更宽。
③ 使用:子类引用.方法名(实参);//子类中的方法优先被调用
④ 注意:
a. 方法名、形参列表一样,返回值不同,这种情况下编译报错。
b. 方法名、返回值类型一样;参数列表不同,这种情况下编译、运行
都可以,是一种重载。
⑤ 应用场景:当父类中的方法无法满足子类的需求时,子类覆盖父类中的方法。
4. 父类是子类的共性抽取。【理解】
父类中的信息是一般的、抽象的;
子类中的信息是特殊的、具体的。
5. Java的继承特点:【理解+面试重点】
Java中的类之间是单继承关系,即一个类只能有有一个直接的父类;
但是可以采用多级继承,即可以有多个间接父类。
6. 子类可以继承父类中那些哪容???【理解+面试重点】
① 构造方法不能被继承。
原因:a. 构造方法的方法名必须和类名一致;
b. 子类中有更多的属性和方法,所有构造过程相对复杂,
所以父类的构造方法不足以满足子类,所以子类必须
定义自己的构造方法。
② 属性/成员方法取决于访问修饰符。
本类 同包 不同包的子类 其他(不同包下的非子类)
private :私有的 OK
[default]:默认的 OK OK
protected:受保护的 OK OK OK
public : 公开的 OK OK OK OK
注意:a. 4 个访问修饰符都可以修饰属性、成员方法、构造方法
b. 只有public / default可以修饰类
总结:
继承(属性/成员方法)
private(私有的)
不能被继承
[default](默认的) 同包子类可以继承
protected(受保护的) 可以被继承
public (公开的) 可以被继承
7. 对象的创建过程:【理解】
① 分配空间(子类+所有的父类):给属性赋默认值
② 递归的构造父类对象(初始化父类属性--》调用父类的构造方法)
③ 初始化子类的属性
④ 调用子类的构造方法
8. super的应用【开发应用重点】
① 第一种用法:super()
super()/super(实参):用在子类的构造方法中,代表创建子类
对象时,先去创建父类对象,指定创建父类对象时调用父类
的哪一个构造方法。
注意:a.super()用在构造方法中第一行有效语句。
b.如果构造方法中第一行没有super()/super(实参)/this()
JVM会默认添加一个super();
c. 一个构造方法中 this()/this(实参)不能和
super()/super(实参)同时应用。
d. 如果构造方法的第一行是this()/this(实参),JVM会放弃在
当前构造方法中查找super,从而转向this()所指向的构造方
法去查找super().
② super的第二种用法:super.
super.属性 /super.方法名(实参):代表在子类中调用父类中的属性或是成员方法;
注意: super. 可以用在子类中的成员方法、构造方法中。
super.属性名 :代表访问父类中属性
super.方法名(实参):代表访问父类中成员方法
eg:
package demo20171030;
/**
* 员工薪资
*
*
*/
public class Question_06 {
public static void main(String[] args) {
Employee[] em = { new SalariedEmployee("张一", 6, 1000), new HourlyEmployee("张二", 6, 12, 2000),
new SalesEmployee("张三", 6, 30000, 0.5), new BasePlusSalesEmployee("张四", 6, 40000, 0.5, 2000) };
// 强转
SalariedEmployee sa = (SalariedEmployee) em[0];
HourlyEmployee ho = (HourlyEmployee) em[1];
SalesEmployee sal = (SalesEmployee) em[2];
BasePlusSalesEmployee ba = (BasePlusSalesEmployee) em[3];
// SalariedEmployee sa = new SalariedEmployee("张一", 6, 1000);
System.out.println("~~~~~~~~~~~~~~~~~~张一的基本信息和薪资~~~~~~~~~~~~~~~~~~");
System.out.println("姓名:" + sa.getName() + "\n" + "出生月份:" + sa.getMonth() + "月" + "\n" + "薪资:" + sa.getSalary(10)+"\n"+"加班费:"+sa.jiaBan());
// HourlyEmployee ho = new HourlyEmployee("张二", 6, 12, 2000);
System.out.println("~~~~~~~~~~~~~~~~~~张二的基本信息和薪资~~~~~~~~~~~~~~~~~~");
System.out.println("姓名:" + ho.getName() + "\n" + "出生月份:" + ho.getMonth() + "月" + "\n" + "工作小时:" + ho.getHours()+ "小时" + "\n" + "薪资:" + ho.getSalary(10));
// SalesEmployee sal = new SalesEmployee("张三", 6, 30000, 0.5);
System.out.println("~~~~~~~~~~~~~~~~~~张三的基本信息和薪资~~~~~~~~~~~~~~~~~~");
System.out.println("姓名:" + sal.getName() + "\n" + "出生月份:" + sal.getMonth() + "月" + "\n" + "月销售额:"+ sal.get
b75b
Sales() + "\n" + "提成率:" + sal.getRate() + "\n" + "薪资:" + sal.getSalary(10));
// BasePlusSalesEmployee ba = new BasePlusSalesEmployee("张四", 6, 40000,// 0.5, 2000);
System.out.println("~~~~~~~~~~~~~~~~~~张四的基本信息和薪资~~~~~~~~~~~~~~~~~~");
System.out.println("姓名:" + ba.getName() + "\n" + "出生月份:" + ba.getMonth() + "月" + "\n" + "月销售额:" + ba.getSales()+ "\n" + "提成率:" + ba.getRate() + "\n" + "底薪:" + ba.getBaseSalary() + "\n" + "薪资:" + ba.getSalary(10)+"\n"+"加班费:"+ba.jiaBan());
System.out.println("~~~~~~~~~~~~~~~~~~本月公司总共发放的加班费~~~~~~~~~~~~~~~~~~");
System.out.println("总计:"+(sa.jiaBan()+ba.jiaBan())+"元");
}
}
// 员工
class Employee {
private String name;
private int month;
// 构造方法
public Employee() {
}
public Employee(String name, int month) {
this.name = name;
this.month = month;
}
public void setName(String name) {
this.name = name;
}
public String getName() {
return this.name;
}
public void setMonth(int month) {
this.month = month;
}
public int getMonth() {
return this.month;
}
// 判断员工是否过生日
public double getSalary(int month) {
if (month == this.month) {
return 100;
} else {
return 0;
}
}
}
// 固定工资
class SalariedEmployee extends Employee implements JiaBanfei{
private double salary;
public SalariedEmployee() {
}
public SalariedEmployee(double salary) {
this.salary = salary;
}
public SalariedEmployee(String name, int month, double salary) {
super(name, month);
this.salary = salary;
}
public double getSalary() {
return salary;
}
public void setSalary(double salary) {
this.salary = salary;
}
public double getSalary(int month) {
return this.salary + super.getSalary(month);
}
public double jiaBan() {
return 2000;
}
}
// 按小时
class HourlyEmployee extends Employee {
private int hours;
private double hourlySalary;
public HourlyEmployee() {
}
public HourlyEmployee(String name, int month, int hours, double hourlySalary) {
super(name, month);
this.hours = hours;
this.hourlySalary = hourlySalary;
}
public int getHours() {
return hours;
}
public void setHours(int hours) {
this.hours = hours;
}
public double getHourlySalary() {
return hourlySalary;
}
public void setHourlySalary(double hourlySalary) {
this.hourlySalary = hourlySalary;
}
public double getSalary(int month) {
double dd;
if (hours > 160) {
dd = (hours - 160) * 1.5 * hourlySalary + 160 * hourlySalary;
} else {
dd = hours * hourlySalary;
}
return dd + super.getSalary(month);
}
}
// 销售人员
class SalesEmployee extends Employee {
private double sales;
private double rate;
public SalesEmployee() {
}
public SalesEmployee(String name, int month, double sales, double rate) {
super(name, month);
this.sales = sales;
this.rate = rate;
}
public double getSales() {
return sales;
}
public void setSales(double sales) {
this.sales = sales;
}
public double getRate() {
return rate;
}
public void setRate(double rate) {
this.rate = rate;
}
public double getSalary(int month) {
return this.sales * this.rate + super.getSalary(month);
}
}
// 有固定底薪的
class BasePlusSalesEmployee extends SalesEmployee implements JiaBanfei{
private double baseSalary;
public BasePlusSalesEmployee() {
}
public BasePlusSalesEmployee(String name, int month, double sales, double rate, double baseSalary) {
super(name, month, sales, rate);
this.baseSalary = baseSalary;
}
public double getBaseSalary() {
return baseSalary;
}
public void setBaseSalary(double baseSalary) {
this.baseSalary = baseSalary;
}
public double getSalary(int month) {
return this.baseSalary + super.getSalary(month);
}
public double jiaBan() {
return 1000;
}
}
interface JiaBanfei{ //定义一个接口
public abstract double jiaBan();
}
相关文章推荐
- C# 面向对象三大特性:封装、继承、多态
- oc学习笔记(四)面向对象-类的三大特性:封装,继承,多态
- Java之面向对象的三大特性:封装,继承,多态讲解
- java 面向对象三大特性(封装,继承,多态)以及抽象、接口的介绍
- Java学习第六课--面向对象的三大特性(封装、继承和多态)
- 面向对象的三大特性(封装 继承 多态)
- 面向对象三大特性--封装、继承、多态
- 黑马程序员——OC篇(二)面向对象的三大特性(封装、继承、多态)
- JavaScript基础--面向对象三大特性(八):继承封装多态
- 面向对象的三大特性:封装,继承,多态
- C# 面向对象三大特性:封装、继承、多态
- 深入理解Java面向对象三大特性 封装 继承 多态
- 补习:C# 面向对象三大特性:封装、继承、多态
- java语言基础(23)——面向对象三大特性(封装、继承、多态)
- C# 面向对象三大特性:封装、继承、多态
- OC面向对象的三大特性:封装,继承,多态
- OC温故:面向对象的三大特性(封装,继承,多态)
- 面向对象三大特性(封装、继承和多态)
- 黑马程序员——OC面向对象三大特性——封装,继承,多态。
- 面向对象三大特性:继承、封装、多态