1、类、超类和子类
is-a 关系是继承的一个明显特征
经理有普通雇员没有的属性,比如项目奖金,因此需要新建一个 Manager 类。但是,如果他是经理,那么他一定是雇员。
下面是继承 Employee 类来定义 Manager 类的格式,关键词 extends 表示继承:
public class Manager extends Employee {
public Manager(int _age) {
super(_age);
// 因为 Employee 没有仅仅使用默认的构造方法,所以这里也要写明,不然会编译错误
}
}
在 Java 中,所有的继承都是公有继承,没有 C++ 的私有继承和保护继承。
父类和子类是青出于蓝更胜蓝的关系,子类比父类拥有更多的功能,也封装了更多的数据。
继承是一般到特殊、抽象到具体的渐变。
子类是父类的子集,例如经理集合是雇员集合的子集,至于是不是真子集,现在还不懂。-_-
子类可以使用父类的方法,反之不行,如果子类与父类有相同的方法需求但是实现不同,可以使用覆盖 override 来达到这个目的,比如经理和普通雇员的薪水计算方法不同。
至于子类能不能访问父类的私有域,这个又要看一下访问权限了:
作用域 | 当前类 | 同一个包 | 子类 | 其他包 |
---|---|---|---|---|
private | ✔️ | ❌ | ❌ | ❌ |
default ( friendly ) | ✔️ | ✔️ | ❌ | ❌ |
protect | ✔️ | ✔️ | ✔️ | ❌ |
public | ✔️ | ✔️ | ✔️ | ✔️ |
所以现在一目了然了,子类只能访问修饰符为 protect 和 public 的父类的域。如果子类的确需要访问私有域,就要借助有公有接口。
注意:子类只能修改或者增加父类的方法,但不能删除父类中的任何域和方法。
2、this 和 super 的区别
根本区别: this 是对当前对象的引用,而 super 不是,super 只是一个指示编译器调用超类方法的一个关键字。
使用区别:
关键字 | 作用1 | 作用2 |
---|---|---|
this | 引用隐式参数 | 调用该类的其他构造器 |
super | 调用超类的方法 | 调用超类的构造器 |
好吧,这一节内容太多了,可能要拆成三篇来记。