您的位置:首页 > 编程语言 > Java开发

继承 --> 面向对象(Java版本)

2012-10-07 11:36 197 查看
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. 当某类没有显式的编写任何一个构造函数时,那么将会添加一个默认的构造函数
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: