[Java] 7.2. 繼承與建構式

繼承下,物件的建構是層層建構的,由父類別向外到子類別。

 

image/svg+xml7.2. 繼承與建構式 Inheritance & Constructor 建構式,先堆積⼈員物件在堆積員⼯物件 super() ,呼叫⼈員⽗類別的建構式 注意, super() 必須位於第 1 ⾏程式 super() 編譯器⾃動為員⼯類別增添預設建構式 this() ,呼叫⾃已的建構式 建構式與 Object 類別 class Person { String id; String name; String gender; int age; Person ( String pID , String pName ){ id=pID; name=pName; } Person ( String pID , String pName , String pGender , int pAge ){ id=pID; name=pName; gender=pGender; age=pAge; } } class Employee extends Person { String empID; String salary; } 編譯時發⽣錯誤 Employee.java:1: error: no suitable constructor found for Person(no arguments) class Employee extends Person{ ^ constructor Person.Person(String,String) is not applicable (actual and formal argument lists differ in length) constructor Person.Person(String,String,String,int) is not applicable (actual and formal argument lists differ in length) 1 error class Person { String id; String name; String gender; int age; } class Employee extends Person { String empID; String salary; } class Person { String id; String name; String gender; int age; Person(){} Person( String pID, String pName) { id=pID; name=pName; } Person( String pID, String pName, String pGender, int pAge){ id=pID; name=pName; gender=pGender; age=pAge; } } class Employee extends Person { String empID; String salary; Employee (){ super (); } } class Person { String id; String name; String gender; int age; Person() {} Person ( String pID, String pName) { id=pID; name=pName; } Person ( String pID , String pName , String pGender , int pAge ){ id=pID; name=pName; gender=pGender; age=pAge; } } class Employee extends Person { String empID ; int salary ; Employee ( String pID , String pName , String pGender , int pAge , String pEmpID , int pSalary ){ super ( pID , pName , pGender , pAge ); empID = pEmpID ; salary = pSalary ; } } class Person { // 略過⼀些程式 Person ( String pID, String pName, String pGender, int pAge ){ id=pID; name=pName; gender=pGender; age=pAge; } } class Employee extends Person { String empID; int salary; Employee ( String pID, String pName, String pGender, int pAge, String pEmpID, int pSalary){ super (pID, pName, pGender, pAge); empID=pEmpID; salary = pSalary; super (pID, pName, pGender, pAge); } } 編譯時發⽣錯誤 Employee.java:10: error: call to super must be first statement in constructor super(pID, pName, pGender, pAge); ^ 1 error class Person { String id; String name; String gender; int age; Person () {} // 略過⼀些程式 } class Employee extends Person { String empID; int salary; Employee () { super () ; } Employee ( String pID, String pName, String pGender, int pAge, String pEmpID, int pSalary){ super () ; id = pID; name = pName; gender = pGender; age = pAge; empID=pEmpID; salary = pSalary; } } class Person { String id; String name; String gender; int age; Person() {} // 略過⼀些程式 } class Employee extends Person { String empID; int salary; Employee () { } Employee ( String pID, String pName, String pGender, int pAge, String pEmpID, int pSalary){ id = pID; name = pName; gender = pGender; age = pAge; empID=pEmpID; salary = pSalary; } } class Person { String id; String name; String gender; int age; Person() {} // 略過⼀些程式 } class Employee extends Person { String empID; int salary; Employee () { super () ; } Employee ( String pID, String pName, String pGender, int pAge, String pEmpID, int pSalary){ this () ; id = pID; name = pName; gender = pGender; age = pAge; empID=pEmpID; salary = pSalary; } } class Person { String id; String name; String gender; int age; Person () { super (); } Person ( String pID, String pName) { id=pID; name=pName; } Person ( String pID, String pName, String pGender, int pAge ){ id=pID; name=pName; gender=pGender; age=pAge; } } J7_2_1 – Person.java 1. 這是⼈員類別( Person )。 J7_2_1 – Employee.java 2. ⼈員類別提供了兩個建構式。 3. 這是員⼯類別( Employee ),其繼承⾃⼈員類別。 4. 單純的繼承⾃⼈員類別,但 編譯告訴我們,它 找不到⼀個沒有任何參數的建構式- Person() 。難 道建立員⼯物件跟⼈員物件有關?! 1. 這是⼈員類別( Person )。 2. 員⼯類別( Employee )繼承⾃⼈員類別。 Employee Employee() 2 Person 1 Person() 5. ⼈員類別的實體物件。 4. 員⼯類別的實體物件。 3. 因此建構式的呼叫順序就堆積⽊⼀樣,必須 先從⽗類別的建構式開始呼叫,這樣才能先將 ⽗類別部份的所有屬性、⽅法都先準備好,⽽ 後在進執⾏⼦類別建構式中的剩餘的程式。 J7_2_2 – Person.java J7_2_2 – MainClass.java 1. 這是⼈員類別( Person )。 3. 員⼯類別( Employee )繼承⾃⼈員類別。 2. 為⼈員類別加上預設的建構式。記住,這是不⼀ 定需要的,因為我們已經有另外兩個⼈員類別的建 構式了,這麼做只是為了簡化後⾯的說明⽽已。 4. 在員⼯類別的建構式中 5 使⽤ super 關鍵字,然後加上單引號( ( ) )即可以呼叫⽗類別的建 構式了,如此即先完成了⽗類別-⼈員類別所屬的物件的建立了。記 住,使⽤ super 關鍵字呼叫⽗類別的建構式,只會出現在⼦類別的建構 式中,為的就是要建立⽗類別部份的物件⽤的。 J7_2_3 – Person.java 1. 這是⼈員類別( Person )。 3. 員⼯類別( Employee )繼承⾃⼈員類別。 2. 這是 4 個參數的⼈員建構式。 4. 提供⼀個員⼯類別的建構式,可以⼀次接收 所有的員⼯資訊,這當然包含⼈員部的資訊。 5. 將屬於⼈員部份的資訊交給⼈員的 建構式來進⾏屬性的初始化。 6. 屬於員⼯部份的資訊,則由此員⼯建構式來進⾏初始化的動作。 J7_2_4 – Person.java 1. 這是⼈員類別( Person ),其中有個⾃訂建構式。 1. 這是⼈員類別( Person ),其提供沒有參數的預設建構式。 J7_2_4 – Employee.java 2. 這是員⼯類別( Employee ),其繼承⾃⼈員類別。 3. 在員⼯類別的建構式中 4. 將呼叫⽗類別的建構式- super() 移⾄最後⼀⾏。 5. ⽽呼叫⽗類別的建構式不是在第1⾏的意思是不先進⾏⽗類別⼈ 員物件的建立動作,這時會發⽣編譯錯誤。這個錯誤指出 super 關鍵 字呼叫⽗類別的建構式必須在第1⾏的程式。為的就是希望您先建立 ⼈員部份物件,⽽後才能在⼈員物件上堆積出員⼯物件。 J7_2_5 – Person.java 1. 這是⼈員類別( Person )。 2. 注意,⽗類別⼈員類別有提供預設的建構式。 J7_2_5 – Employee.java 3. 這是員⼯類別( Employee ),其繼承⾃⼈員類別。 4. 怎麼⼦類別 - 員⼯類別的所有建構式都可以不⽤在 1 ⾏使⽤ super 呼叫⽗類別 - ⼈員類別的建構式,最後卻 還可以編譯且執⾏成功?不是說好⼦類別的建構式,必須 於第 1 ⾏程式,使⽤ super() 呼叫⽗類別的建構式的嗎?! J7_2_5 – Person.java J7_2_5 – Employee.java 4. 提醒您,記得要為⽗類別提供預設的建構式,這樣編譯 器⾃動為⼦類別的建構式加上預設建構式- super() 2. 這是員⼯類別( Employee ),其繼承⾃⼈員類別。 3. 雖然在員⼯類別的 2 個建構式中,皆無⼿動使⽤ super() 呼叫⽗類別的建構式,但編譯器會為所有未使⽤ super 的建構 式加上 “super()” 以呼叫⽗類別的預設建構式。但記得,編 譯器只會使⽤ super() ,不會使⽤帶有參數的 super() ,因 為編譯器也不知道要如何正確的使⽤帶有參數的 super() super(); super(); J7_2_6 – Person.java J7_2_6 – Employee.java 1. 這是⼈員類別( Person ),其提供沒有參數的預設建構式。 2. 這是員⼯類別( Employee ),其繼承⾃⼈員類別。 3. 在此可於其中⼀個員⼯建構式中,透過 this 關鍵字呼叫⾃⾝類別上的另⼀個建構式。 4. 最後⼀個建構式⼀個要呼叫⽗類別的建構式,以完成 ⽗類別的物件的建立動作,否則會發⽣編譯錯誤。 J7_2_7 – Person.java super(); super(); extends Object 1. 這是⼈員類別( Person )。 2. 編譯器會為所有未⼿動繼承⾃其他類別的類別,⾃動繼承 Object 類別,在此即為⼈員類別⾃動繼承⾃ Object 類別。 3. 這時,我們可以在建構式中明確的透過 super() 呼叫⽗類別 -Object 的預設建構式。 4. 當然,也可以等待編譯器⾃動為我們加上 super() 為什麼提供了⼈員類別的建構式後, 繼承⾃⼈員類別的員⼯類別會編譯失敗? 1 1 super() ,呼叫帶有參數的建構式 - J7_2_3 – Employee.java 1 1 為什麼未使⽤ super 關鍵字呼叫⽗類別⼈員類別的建構式, 卻還是可以建立員⼯類別?

留言