[Java] 6.1. 繼承

繼承,細分與特化您的物件。

 

image/svg+xml6.1. 繼承 - Inheritance class Employee extends Person { } class Person { String id ; String name ; String gender ; private int age ; void show() { System.out.println( " 我的⾝份證字號是 " + id); System.out.println( " 姓名是 " +name); System.out.println( " 姓別是 " +gender); System.out.println( " 年齡是 " +getAge()); } int getAge () { if (gender == " 女⽣ " ) return 18 ; return age; } void setAge ( int newAge){ if (newAge < 0 || newAge > 150 ) System.out.println( " 年齡必須介於 0~150 之間 " ); else age = newAge; } } class Main{ public static void main( String [] args){ Employee e = new Employee (); e.id = "k1234567890" ; e.name = "jack" ; e.gender = " 男⽣ " ; e.setAge ( 25 ); System.out.println( e.id ); System.out.println( e.name ); System.out.println( e.gender ); System.out.println( e.getAge ()); } } 執⾏結果 k1234567890 jack           男⽣ 25 class Person { // 略過⼀些程式 private int age ; // 略過⼀些程式 private int getRealAge (){ return age; } } class Employee extends Person { void tryToGetSecret(){ System.out.println( age ); System.out.println( getRealAge ()); } } 編譯時發⽣錯誤 Employee.java:4: error: age has private access in Person System.out.println(age); ^ Employee.java:5: error: cannot find symbol System.out.println(getRealAge()); ^ symbol: method getRealAge() location: class Employee 2 errors class Employee extends Person { } class Employee extends Person { String employeeID ; int salary ; void goToWork (){ System.out.println( " 上班去 " ); } void comeOffWork (){ System.out.println( " 下班了 " ); } } class Main{ public static void main( String [] args){ Employee e = new Employee (); e.id = "k1234567890" ; e.name = "jack" ; e.gender = " " ; e.setAge ( 25 ); e.employeeID = "048679" ; e.salary = 40000 ; e.goToWork (); e.comeOffWork (); System.out.println(e.employeeID); System.out.println(e.salary); } } 執⾏結果 上班去 下班了 048679 40000 class Main{ public static void main( String [] args){ Person p = new Person (); p.id = "k1234567890" ; p.name = "jack" ; p.gender = " " ; p.setAge ( 25 ); p.employeeID = "048679" ; p.salary = 40000 ; p.goToWork (); p.comeOffWork (); } } 編譯頭發⽣錯誤 Main.java:10: error: cannot find symbol p.employeeID = "048679"; ^ symbol: variable employeeID location: variable p of type Person Main.java:11: error: cannot find symbol p.salary = 40000; ^ symbol: variable salary location: variable p of type Person Main.java:12: error: cannot find symbol p.goToWork(); ^ symbol: method goToWork() location: variable p of type Person Main.java:13: error: cannot find symbol p.comeOffWork(); ^ symbol: method comeOffWork() location: variable p of type Person 4 errors 1. 員⼯的英⽂是 Employee J6_1_1 – Employee.java 年齡: 20 ⾝份證號: K000111222 員⼯編號: 048679 薪⽔: 40000 姓名:王⼩明 ⼈員變成員⼯,必須可以 下班 上班 員⼯除了包含員⼯的所有資訊與⾏為,還含有員⼯特有的資訊與⾏為,員⼯編 號( employeeID )、薪資( salary )資訊與⼯作( work )⾏為。為了讓員 ⼯擁有⼈員的資訊與⾏為,不就要把⼈員類別中的程式碼拷⾙並重貼到新的員 ⼯物件中?但更糟的是若只有⼈員的類別檔( Person.class )時,那不就拷 ⾙不到⼈員類別中的程式? 2. 使⽤ extends 關鍵字, 代表著要進⾏繼承。 3. 這是要被繼承的類別-⼈員類別( Person )。 J6_1_1 – Person.java 4. 這是本章所使⽤的⼈員類別 Person ),在此先回憶⼀下。 5. 只有年齡屬性( age )是私有化的。 6. 年齡屬性( age )的設值式與取值式。 J6_1_1 – Main.java 2. 員⼯物件上使⽤到的屬性與⽅法都是繼承⾃⼈員類別 Person ),⽽繼承的意思就是員⼯物件也將會有⼈員物件所擁有 的屬性與⽅法,所以員⼯物件可以使⽤定義在⼈員中的屬性與⽅法。 1. 建立員⼯物件( Person )。 J6_1_2 – Person.java 1. 建立員⼯物件( Person )。 2. 其中有個私有化的年齡屬性( age )。 3. 與私有化的取得真實年齡⽅法 getRealAge() )。這只是個隨意加上的⽅法, 僅為了驗私有化的⽅法不可被繼承。 J6_1_2 – Employee.java 4. 這是員⼯類別( Employee ), 它繼承⾃⼈員類別( Person )。 5. 繼承並不會將私有化的屬性與⽅法繼承下來。私有於⼈ 員的屬性與⽅法永遠私有於⼈員,即使在員⼯類別上建立⼀個 ⽅法,直接在類別內容使⽤私有化的屬性與⽅法也是⼀樣不可 ⾏的。就像秘密永遠就是秘密。若執意存取年齡屬性與呼叫取 得真實年齡⽅法的話,則會發⽣編譯失敗,編譯器會告訴您年 齡屬性與取得真實年齡⽅法是私有於⼈員類別的。 J6_1_3 – Employee.java 1. 繼承者-員⼯   類別 Employee ),⼜可稱為是⼦類別。 3. 被繼承者-⼈員類別 Person ),⼜可稱為是⽗類別。 2. Java 透過 extends 進⾏繼承。 5. 最上⽅是類別的名稱。 6. 第⼆格是⽤來表⽰此 類別所擁有的屬性。 7. 第三格是⽤來表⽰此 類別所擁有的⽅法。 9. 因為單箭頭連結線,表⽰員 ⼯類別( Employee )將繼承⾃ ⼈員類別( Perosn ),同時亦 可稱員⼯類別為⼦類別。 4. 這是 UML ⽤來表⽰類別的⽅式。 主要是以⽅形來表⽰類別。主要分為 三個區塊:類別名稱、屬性與⽅法。 8. 這個單箭頭的連結 線表⽰繼承的意思。有 箭頭的那⼀端連結著⽗ 類別,⽽無箭頭的則是 連結⼦類別。 1. 這是員⼯類別( Employee ),它繼承⾃⼈員類別( Person )。 2. 這是專⾨為員⼯增加的員⼯編號屬性( employeeID )。 3. 這是專⾨為員⼯增加的 薪資屬性( salary )。 4. 這是專⾨為員⼯增加的上班 ⽅法( goToWork() )。 5. 這是專⾨為員⼯增加的下班 ⽅法( goOffWork() )。 6. 只要直接在員⼯類別中宣告 屬性與⽅法,這樣就可以為員⼯ 設定專屬於員⼯的資訊與⾏為。 J6_1_3 – Main.java 9. 新宣告在員⼯類別上的屬性 與⽅法,則透過員⼯物件使⽤。 7. 建立員⼯物件( Employee )。 8. 繼承⾃⼈員類別( Person 的屬性與⽅法仍是可以使⽤。 J6_1_4 – Main.java 3 這是⼈員類別的屬性與⽅法, ⼈員物件⼀定可以使⽤。 4. 千萬別在⼈員物件上使⽤員⼯的屬性與⽅法。這是⾏不通 的,這些⽅法是專屬於員⼯的。若您透過⼈員物件來使⽤宣告 在員⼯類別上的屬性與⽅法,編譯時會發⽣錯誤。 2 建立⼈員物件( Person )。 1. 繼承是單向的,僅可由上往下 繼承,無法由下往上繼承。 1 步, extends 讓員⼯繼承⼈員 2 步,使⽤繼承的屬性與⽅法 員⼯繼承⼈員,即產⽣⼦類別與⽗類別的關係 員⼯類別中,加上專屬的屬性與⾏為 上班去,⼈員變成了員⼯ 注意, private 的屬性或⽅法無法被繼承 注意,⽗類別不可存取⼦類別的屬性與⽅法 1 2 3 4 1 2 3 4 1 2 1 2 1 2 3 4 1 2 3 4 1 2 3 4 1 2 3 4

留言