繼承
調(diào)用
public static void main(String[] args) {
new Child();
}
class Parent{
// public Parent() {
System.out.println("默認先調(diào)用父類無參構造方法");
// }
public Parent(String test) {
}
}
class Child extends Parent{
public Child() {
當父類中沒有無參數(shù)的構造函數(shù)時坛悉,子類必須手動通過super語句來指定要訪問的構造函數(shù)。
super("Test");
System.out.println("再調(diào)用子類無參構造方法");
}
}
繼承體系初始化順序
創(chuàng)建子類對象時承绸,默認先調(diào)用父類的無參構造方法裸影,當父類中存在多個構造方法,但沒有無參構造方法時军熏,子類必須通過super來指定要訪問的父類構造方法轩猩。
子類中可以通過this來調(diào)用本身的構造函數(shù),但至少有一個構造方法訪問父類中的構造方法荡澎。
為什么要首先調(diào)用父類的構造方法均践,意義在哪里?
父類中非private修飾的數(shù)據(jù)摩幔,子類都可以直接獲取彤委。
因此子類在實例化時,需要先查看父類對這些數(shù)據(jù)進行了怎樣的初始化或衡,這就需要先訪問父類的構造方法焦影。
繼承使用注意
Java語言只支持單繼承,不支持多繼承封断,因為多繼承容易帶來安全隱患(多繼承斯辰,各父類中如果有相同函數(shù)名的函數(shù),調(diào)用會沖突)坡疼。
Java支持多層繼承彬呻,如A extends B; C extends A;。
繼承體系的使用
先查看基類柄瑰,因為基類中定義的是該體系中共性的功能废岂,通過了解共性功能,就可以知道該體系的基本功能狱意。
在具體調(diào)用時湖苞,要創(chuàng)建最子類的對象。
因為父類有可能不能創(chuàng)建對象详囤,如抽象類财骨,創(chuàng)建子類對象可以使用更多的功能。(基類本身的共性功能藏姐,子類特有功能)隆箩。
父類設計的遵循規(guī)則
盡量隱藏父類的內(nèi)部數(shù)據(jù),盡量把父類的成員變量都設置成private羔杨,不要讓子類直接訪問父類的成員變量捌臊。
禁止子類隨意訪問、修改父類的函數(shù)兜材,如父類中的輔助工具函數(shù)理澎,要使用private修飾逞力,防止子類訪問。
如果父類中的函數(shù)需要被外部類調(diào)用糠爬,則必須以public修飾寇荧,但是又不希望被子類重寫該函數(shù),可以使用final修飾执隧。
如果父類的某個函數(shù)允許被子類重寫揩抡,但不允許被其他類訪問,則可以使用protected來修飾函數(shù)镀琉。
盡量不要在父類構造器中調(diào)用將要被子類重寫的方法峦嗤。
組合復用
可以將一個類作為另一個類的組件,組合進去進行調(diào)用屋摔。
class Computer {
private Widget widget;
public Computer(Widget widget) {
this.widget = widget;
}
public void loadHardDisk() {
widget.loadHardDisk();
}
}
class Widget {
public void loadHardDisk() {
System.out.println("加載型號1硬盤");
}
}