Java中子類和父類之間的呼叫關係
阿新 • • 發佈:2018-12-26
在講之前,一些基本知識是應該具備的:
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的無參構造方法。最後再打印出資訊。