继承 --> 面向对象(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. 当某类没有显式的编写任何一个构造函数时,那么将会添加一个默认的构造函数

posted @ 2012-10-07 11:36  papertiger  阅读(176)  评论(0)    收藏  举报