《Java核心技术》第五章 继承 学习笔记

第5章 继承

本章将学习面向对象程序设计的另外一个基本概念:继承(inheritance)。

利用继承,人们可以基于已存在的类构造一个新类。继承已存在的类就是复用(继承)这些类的方法和域。在此基础上,还可以添加一些新的方法和域,以满足新的需求。这是Java程序设计中的一项核心技术。

另外,本章还阐述了反射(reflection)的概念。反射是指在程序运行期间发现更多的类及其属性的能力。这是一个功能强大的特性,使用起来也比较复杂。

5.1 类、超类和子类

5.1.1 定义子类

下面是由继承Employee类来定义Manager类的格式,关键字extends表示继承。

public class Manager extends Employee {
     
    // 添加方法和域
}

关键字extends表明正在构造的新类派生于一个已存在的类。已存在的类称为超类(superclass)、基类(base class)或父类(parent class);新类称为子类(subclass)、派生类(derived class)或孩子类(child class)。

尽管Employee类是一个超类,但并不是因为它优于子类或者拥有比子类更多的功能。实际上恰恰相反,子类比超类拥有的功能更加丰富。

public class Manager extends Employee {
     
    private double bonus;
    
    public void setBonus(double bonus)
    {
     
        this.bonus = bonus;
    }
}

当然,由于setBonus方法不是在Employee类中定义的,所以属于Employee类的对象不能使用它。

然而,尽管在Manager类中没有显式地定义getName和getHireDay等方法,但属于Manager类的对象却可以使用它们,这是因为Manager类自动地继承了超类Employee中的这些方法。

同样,从超类中还继承了name、salary和hireDay这3个域。这样一来,每个Manager类对象就包含了4个域:name、salary、hireDay和bonus。

在通过扩展超类定义子类的时候,仅需要指出子类与超类的不同之处。因此在设计类的时候,应该将通用的方法放在超类中,而将具有特殊用途的方法放在子类中,这种将通用的功能放到超类的做法,在面向对象程序设计中十分普遍。

5.1.2 覆盖方法

然而,超类中的有些方法对子类Manager并不一定适用。具体来说,Manager类中的getSalary方法应该返回薪水和奖金的总和。为此,需要提供一个新的方法来覆盖(override)超类中的这个方法:

super是一个指示编译器调用超类方法的特殊关键字。

@Override
public double getSalary() {
     
    return super.getSalary() + bonus;
}

5.1.3 子类构造器

public Manager(String name, double salary, int year, int month, int day)
{
    super(name, salary, year, month, day);
    bonus = 0;
}

你可能感兴趣的:(Java)