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:  李經理

每個類都必須直接或間接地從其建構函式中呼叫其超類別建構函式。如果超類沒有無引數建構函式,那麼必須顯式地呼叫超類的其他建構函式。