1. 程式人生 > 其它 >深入理解super關鍵字

深入理解super關鍵字

super關鍵字總是指向當前物件的父類物件的引用

super關鍵字的作用

  • 在子類的構造器中顯示呼叫父類的構造器
  • 在子類中訪問父類中定義的、被隱藏的成員變數或父類中定義的、被重寫的(Override)的成員方法

呼叫父類構造器

package com.ch05;
class Base{
    public double size;
    public String name;
    public Base(double size, String name){
        this.size = size;
        this.name = name;
    }
}


public class Sub extends Base{
    public String color;
    public Sub(double size, String name, String color){
        super(size, name);
        this.color = color;
    }

    public static void main(String[] args) {
        Sub sub = new Sub(5.6, "測試物件", "黑色");
        System.out.println(sub.size + "---" + sub.name + "---" + sub.color); // 5.6---測試物件---黑色
    }
}

子類構造器呼叫父類構造器分如下幾種情況:

  • 子類構造器執行體的第一行使用super顯式呼叫父類構造器,系統將根據super呼叫裡傳入的實參列表呼叫父類對應的構造器。
  • 子類構造器執行體的第一行程式碼使用this顯式呼叫本類中過載的構造器,系統將根據this呼叫裡傳入的實參列表呼叫本類中的另一個構造器。執行本類中另一個構造器時也會先呼叫父類構造器。
  • 子類構造器執行體中既沒有super呼叫,也沒有this呼叫,系統將會在執行子類構造器之前,隱式呼叫父類無引數的構造器。

訪問父類成員變數和方法

package com.ch05;

class BaseClass{
    public int a = 5;
}


public class SubClass extends BaseClass {
    public int a = 10;
    public void accessSub(){
        System.out.println(a);
    }
    public void accessBase(){
        System.out.println(super.a);
    }

    public static void main(String[] args) {
        SubClass subClass = new SubClass();
        subClass.accessSub(); // 10
        subClass.accessBase(); // 5
    }
}

如果在某個方法中訪問名為a的成員變數,但沒有顯式指定呼叫者,則系統查詢a的順序為:

  1. 查詢該方法中是否有名為a的區域性變數。
  2. 查詢當前類中是否包含名為a的成員變數。
  3. 查詢a的直接父類中是否包含名為a的成員變數,依次上溯a的所有父類,直到java.lang.Object類,如果最終不能找到名為a的成員變數,則系統出現編譯錯誤。

如果被覆蓋的是類變數,在子類的方法中則可以通過父類名作為呼叫者來訪問被覆蓋的類變數。

當程式建立一個子類物件時,系統不僅會為該類中定義的例項變數分配記憶體,也會為它從父類繼承得到的所有例項變數分配記憶體,即使子類定義了與父類中同名的例項變數。也就是說,當系統建立一個Java物件時,如果該Java類有兩個父類(一個直接父類A,一個間接父類B),假設A類中定義了2個例項變數,B類中定義了3個例項變數,當前類中定義了2個例項變數,那麼這個Java物件將會儲存2+3+2個例項變數。