继承 --> 面向对象(Java版本)
Tutorial 1: 公司的雇员与经理
Term: superclass --> 超类 subClass --> 扩展类
继承使用的前提:
满足"is-a"的关系.例如:经理也是职员,但是经理却拥有雇员没有的属性(经理有员工没有的分红部分)
继承设计的原则:
将一般性的,通用的属性和方法放置到父类中,而将特殊的属性以及方法放置到子类中
View Code
public class Employer { public Employer() { } public Employer(String name) { this.name = name; this.salary = 0; //不需要,默认会初始化为0 } public Employee(String name,double salary){ this.name = name; this.salary = salary; } public void setName(String name) { this.name = name; } public void setSalary(double salary) { this.salary = salary; } public String getName() { return name; } public double getSalary() { return salary; } private double salary; private String name; } public class Manager extends Employee{ public Manager(){ //super(); //Default } public Manager(String name){ super(name,0); } public Manager(String name,double salary){ super(name,salary); } public void setBonus(double bonus){ this.bonus = bonus; } public double getSalary(){ double baseSalary = super.getSalary(); //Why not use: salary + bonus OR getSalary() + bonus; return baseSalary + bonus; } private double bonus; }
由于设计类时,需满足封装的特性:所以Employee的salary无法直接被父类Manager访问到. 而需要有public访问控制权限的才能访问到。然而直接使用getSalary是调用自己的方法,而不是父类的方法。所以编译器额外提供super关键字来声明调用父类的方法,而非自己的方法。
this 和 super
this关键字和super有着可类比的地方:
1. 访问当前对象的某个方法可以使用:this.方法名,而访问父类的方法:super.方法名
2. 调用另外一个构造函数:this(参数列表) 调用父类的构造函数 super(参数列表) 并且该两种使用构造函数的方式必须是构造函数方法体的第一句句
3. 访问当前对象的某个属性:this.属性名,而访问父类的属性名: super.属性名 (当发生了属性覆盖的时候,根据属性最近原则来确定是哪个对象)对属性进行覆盖的情况很少出现
然而这两个概念有着一定的区别:
this表明的是当前对象的引用,而super关键字只是表明需要运行父类的方法,或者构造方法。其并非引用,不可能给super字段进行对象引用的赋值。
继承可以增加字段,增加方法,甚至修改方法(通过方法的覆盖来实现)然而继承无法删除字段,删除方法。
继承关系的构造函数的调用:
1. 在扩展类中,如果不显式的调用基类的构造函数,那么扩展类将会调用基类的默认的构造函数(无参构造函数--当基类不提供该默认的构造函数,将会报错)
2. 扩展类中,如果显式的调用了某基类的构造函数,那么扩展类将不会自动的调用基类的默认的构造函数
默认构造函数是否被自动的添加到基类中:
1. 该类是否已经显式的编写过构造函数,如果已经编写了构造函数,那么编译器并不为我们自动添加默认的构造函数。
2. 当某类没有显式的编写任何一个构造函数时,那么将会添加一个默认的构造函数


浙公网安备 33010602011771号