Java this與super的仇與恨
剛開始學習面向物件的時候,看到this和super覺得this就是指當前物件,super指最近的父級物件。覺得用處不大。
後來,隨著學習的深入,看別人的程式碼越來越多,發現this和super的使用率賊高~,就決定深入的瞭解一下這倆兄弟。
既然設計到繼承和物件,我們就可以從JVM的堆疊的角度去分析。
首先,當我們建立一個子類的時候,在堆中的子類物件一定包含著其繼承的父類物件。如果子類和父類都包含名字為value的成員變數。我們可以用this和super來進行操作。
老規矩,show you my code。程式碼中參悟。
父類:
public class Father {
int value;
public void val() {
value = 10;
System.out.println("Father'value is" + value);
}
}
子類:
public class Child extends Father {
int value;
public void dirValue() {
value = 20;
System.out.println("Child'value is " + value);
// 這時候應該為0
System.out.println("子類中沒有呼叫super的Father" + super.value); super.val(); // 這個時候應該為10 System.out.println("子類中呼叫super之後的Father" + super.value); System.out.println("Child'value is" + value); } }
客戶端:
public class Client {
public static void main(String[] args) {
Child child = new Child();
child.dirValue();
}
}
輸出結果:
分析:
當客戶端建立子類的時,堆疊中的儲存結構是這樣的~
執行new child例項的時候:
棧 堆
child ——》 Child物件(包含Father物件)
Child本身包含一個value的成員變數
Child中的Father物件也含有一個value的成員變數
當程式執行到child.dirValue()的時候:
先給value成員變數賦值,這個時候是給自己物件中的value賦值。
super.value,這個是指向這個child中Father物件的value,因為沒有給其賦值,編譯器會自動給其初始化為0。
呼叫Father的中的方法,方法列印還有給Father物件value賦值。
最後為了檢驗對父類的操作沒有影響到子類的value值。
總結:
this:
this是指向當前的物件,其本質就是一個指標了。
this可以用於當成員變數的名稱和引數相沖突的時候用this.成員變數來指定。
this可以用於建構函式之中,用來引用其他的建構函式。(必須是第一行)
super:
super是指向當前物件裡的父類的物件。(super在Java中是個關鍵詞)
子類構造方法用了super指的是呼叫父類中的構造方法。