Java 中建立子類物件會建立父類物件麼?

wangchao96發表於2018-08-31

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,便可對該屬性進行相關操作。

    • 靜態繫結:(finalstaticprivate)在程式執行前已經被繫結,也就是說在編譯過程中就已經知道這個熟悉或方法是哪個類的方法,此時由編譯器獲取其他連線程式實現。

    • 動態繫結:在執行根據具體物件的型別進行繫結。

    類的方法可以被繼承,但是類的構造器和 private 修飾的屬性及方法不能被繼承。

記憶體圖

相關文章