Java中子類和父類間的調用關係

在講之前,一些基本知識是應該具備的:  1、如果一個類中沒有定義構造器,編譯器在編譯時會自動加上默認無參構造器:
  public ClassName {}
  2、this 和 super 的區別。
  3、每個類直接或間接是Object的子類,Object只有一個無參構造方法。
  4、編譯器會在每個構造方法的第一行隱式添加父類的默認無參構造器,即添加super()。
  新手容易犯的錯誤:
  class Employee extends Object {
  public Employee(int id) {
  }
  }
  class Teacher extends Employee {
  public Teacher() {
  }
  }
  以上代碼會產生編譯錯誤:
  Implicit super constructor Employee() is undefined. Must explicitly invoke another constructor
  因爲父類定義了一個帶參數的構造器,因此編譯器不會添加默認無參構造方法,但是因爲在子類的構造器中沒有顯式調用父類的某個構造方法,因此編譯器會自動添加super()方法, 但是父類中不存在默認無參構造方法,因此會提示默認無參構造方法未定義錯誤。
  修改後的代碼:
  class Employee {
  public Employee(int id) {
  }
  }
  class Teacher extends Employee {
  public Teacher() {
  super(10);
  }
  }
  這樣,在子類的構造器中顯式調用了父類的某個構造器,所以編譯器不會自動添加super()方法。
  構造器的訪問修飾符:
  一般可以用public,protected,default和private修飾,但是對於private,子類是無法調用該類構造器的。
  多層次調用父類構造方法:
  假設我們有這樣一個層次結構:
  Object->Employee->Teacher->Professor
  class Employee {
  public Employee() {
  System.out.println("Employee constructor called");
  }
  }
  class Teacher extends Employee {
  public Teacher() {
  System.out.println("Teacher constructor called");
  }
  }
  class Professor extends Teacher {
  public Professor() {
  System.out.println("Professor constructor called");
  }
  }
  public class Test {
  public static void main(String args[]) {
  Employee p = new Professor();
  }
  }
  打印結果:
  Employee constructor called
  Teacher constructor called
  Professor constructor called
  在創建Professor對象時(new Professor()),首先會找到該類的無參構造方法,然後首先調用super()方法,調用Teacher類的無參構造方法,接着再調用 Employee的無參構造方法,最後再調用Object的無參構造方法。最後再打印出信息。
發佈了1 篇原創文章 · 獲贊 1 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章