1. 程式人生 > >Java this與super的仇與恨

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指的是呼叫父類中的構造方法。