复用类的两种方式:
- 组合:在新类中包含现有类。
- 继承:新类继承自现有类。
初始化基类
class Father {
public Father() {
System.out.println("Father");
}
}
class Son extends Father {
public Son() {
System.out.println("Son");
}
}
public class Demo {
public static void main(String[] args) {
Son s = new Son();
}
}
/*Output:
Father
Son
*/
子类对象生成时会创建基类对象并包含在子类对象中。
如果基类没有不含参的构造方法则在子类构造方法的第一行用super关键字调用父类构造方法。
子类对象继承自父类对象,希望访问父类的成员及方法,那么创建父类的对象是最好的选择。子类对象不可能凭空产生,需要父类对象先生成,先有父才有子。
代理
在新类中包含现有类对象,并且保留现有类的方法(重新封装)。
如何在组合和继承中选择
组合:在新类中希望借助现有类的功能来完成新类的功能。(has-a)
继承:希望开发出新类的一个特殊版本,拓展其功能。(is-a)
向上转型
将子类转型为其父类或祖类。一个方法的参数可以接受该参数对应类的子类。
final关键字
final常量:一般为基本类型,一旦赋值,其值不可改变。
final引用:该引用只能指向初始化时的对象,不能再指向其他对象。
final参数:在该方法中,无法修改该参数引用指向的对象。
final方法:该方法无法被重写。
final类:不可被继承。
继承与初始化
当当前类被加载时,若当前类继承自某个父类,则加载其父类。
初始化顺序:静态变量/静态代码块 - 匿名代码块 - 成员变量