Java繼承和構造函數

構造函數不是類的成員,它們不是由子類繼承的。它們用於初始化實例變量。

class CSuper {
  public CSuper() {
    System.out.println("Inside CSuper() constructor.");
  }
}

class CSub extends CSuper {
  public CSub() {
    System.out.println("Inside CSub()  constructor.");
  }
}

public class Main {
  public static void main(String[] args) {
    CSub cs = new CSub();
  }
}

上面的代碼生成以下結果。

Inside CSuper() constructor.
Inside CSub()  constructor.

示例

下面顯示了編譯器如何注入一個super()調用來調用父類的無參數構造函數

class CSuper {
  public CSuper() {
    super(); // Injected by the compiler
    System.out.println("Inside CSuper() constructor.");
  }
}

class CSub extends CSuper {
  public CSub() {
    super(); // Injected by the compiler
    System.out.println("Inside CSub()  constructor.");
  }
}

public class Main {
  public static void main(String[] args) {
    CSub cs = new CSub();
  }
}

上面的代碼生成以下結果。

關鍵字super指的是類的直接父類(超類)。可以調用超類構造函數,使用super關鍵字必須要放在構造函數中的第一個語句。

無參數構造函數

可以將超類的無參數構造函數或任何其他構造函數顯式地調用在類的構造函數中的第一個語句。只有在沒有明確添加的情況下,編譯器纔會注入無參數構造函數調用。

class Employee {
  private String name = "Unknown";

  public Employee(String name) {
    this.name = name;
  }

  public void setName(String name) {
    this.name = name;
  }

  public String getName() {
    return name;
  }
}

class Manager extends Employee {
  public Manager(String name) {
    super(name);
  }
}

public class Main {
  public static void main(String[] args) {
    Manager mgr = new Manager("李經理");
    String name = mgr.getName();
    System.out.println("Manager name:  " + name);
  }
}

上面的代碼生成以下結果。

Manager name:  李經理

每個類都必須直接或間接地從其構造函數中調用其超類的構造函數。如果超類沒有無參數構造函數,那麼必須顯式地調用超類的其他構造函數。