0.寫在前面
- 建立物件指的是在堆區開闢空間
- 編譯器在執行子類構造器之前,必須先執行父類構造器;且呼叫父類構造器的語句必須在子類構造器的第一行。
- 構造方法的作用是為堆區中的物件的屬性初始化,不是建立物件。
1.開門見山
Java
中建立子類物件不會
建立父類物件!
2.show me the code!
示例程式碼
/**
* 示例測試類
*
* @author chao.wang
* @date 2018.08.31
*/
public class Test {
public static void main(String[] args) {
// 建立子類物件
Sub sub = new Sub();
// 通過setter設定父類的私有成員變數str
sub.setStr("SubString");
System.out.println(sub.getStr());
}
}
/**
* 示例父類
*
* @author chao.wang
* @date 2018.08.31
*/
class Base {
private String str;
/**
* 父類構造器
*/
public Base() {
System.out.println("Base():" + this);
}
public void setStr(String str) {
this.str = str;
}
public String getStr() {
return this.str;
}
}
/**
* 示例子類
*
* @author chao.wang
* @date 2018.08.31
*/
class Sub extends Base {
/**
* 子類構造器
*/
public Sub() {
System.out.println("Sub():" + this);
}
}
複製程式碼
測試結果
Base():Sub@2f2c9b19
Sub():Sub@2f2c9b19
SubString
複製程式碼
3.幾點疑問
-
是誰在完成建立物件的工作?
new
關鍵字 -
既然沒有父類物件,那麼父類的私有成員變數
str
從何而來?虛擬機器會在堆區中開闢一塊空間來儲存這個私有屬性(該空間不屬於子類物件),並且在執行時該屬性的空間會與方法區中
Base.class
動態繫結。子類物件
sub
呼叫繼承父類的方法setStr()
時,系統會找到與setStr()
方法靜態繫結
的類Base
,再找到與Base
類動態繫結
的屬性空間str
,便可對該屬性進行相關操作。-
靜態繫結
:(final
、static
、private
)在程式執行前已經被繫結,也就是說在編譯過程中就已經知道這個熟悉或方法是哪個類的方法,此時由編譯器獲取其他連線程式實現。 -
動態繫結
:在執行根據具體物件的型別進行繫結。
類的方法可以被繼承,但是類的構造器和
private
修飾的屬性及方法不能被繼承。 -