--- tags: Java --- # Java--繼承、介面與抽象類別 :::success 用途:程式的可讀性與維護性 ::: ## 類別的繼承 :::info ```java= class 子類別名稱 extends 父類別名稱 …… //額外的成員變數和方法 } ``` * 用 **extends** 關鍵字將父類別繼承給子類別 ::: * 繼承:可保有原先的程式碼,並加以擴增和重複使用 * **每個類別只能有一個父類別**,而父類別可擁有一個以上的子類別 >>一個孩子只有一個父親,一個父親可以有很多孩子 * 為「是一種 (is a)」關係 >>父類別:animal;子類別:cat、dog、fox >>cat is an animal;dog is an animal;fox is an animal 範例: ![](https://i.imgur.com/x1k7dlp.png) ![](https://i.imgur.com/UFsdXKY.png) ### 繼承的存取限制 1. 子類別不能存取父類別宣告成 private 的成員變數和方法 > 必須靠父類別中提供的公開操作方法來進行存取 2. 父類別的建構子不屬於類別的成員,所以子類別不能繼承父類別的建構子,只能呼叫父類別的建構子 > 使用super關鍵字來呼叫和存取 ### 覆寫(Overide)和隱藏(Hide) * 覆寫 >> 實例方法 * 隱藏 >> 類別方法、成員變數 ![](https://i.imgur.com/0ontRLE.png) 範例一: ![](https://i.imgur.com/0q3jydV.png) ![](https://i.imgur.com/4KJ6xC0.png) 範例二: ![](https://i.imgur.com/YDvQfCQ.png) ![](https://i.imgur.com/l7qRq6J.png) ### 使用父類別的建構子 **super( )** * 使用**super**關鍵字呼叫父類別的: 1. 建構子 2. 方法 3. 變數 * this( ) 和 super( ) 必須: 1. 存在於建構子的第1行 2. 不能同時存在 3. 不能存在於static成員的程式中實作 範例: ![](https://i.imgur.com/B2U4BIr.png) ![](https://i.imgur.com/aVIgA7I.png) ## 介面 (Interface) * 可以替類別的物件提供共同介面 * 為一種資料型態 * 可以定義類別行為,內含常數和方法的宣告,但是沒有實作的程式碼 * 類別可以實作多個介面 ### 宣告介面 :::info ```java= [public] interface 介面名稱 { [public] [final] [static] 資料型態 常數 = 值; //此值不會被更改 …… [public] [abstract] 傳回值型態 介面方法名 (參數列); //抽象函數並無定義處理方式 …… } ``` ::: :::warning 重點: 1. 介面中的成員變數必設定初值 2. 介面中的方法必為抽象 ::: ### 實作介面方法 :::info ```java= class 類別名稱 implements 介面名稱1, 介面名稱2 { ………… // 實作的介面方法 } ``` * 用 **implements** 關鍵字來指定要實作的介面 ::: 範例一: ![](https://i.imgur.com/REX5QgD.png) ![](https://i.imgur.com/TK0lTCZ.png) ![](https://i.imgur.com/tPXliZ4.png) 範例二 (單一個類別可以實作多個介面): ![](https://i.imgur.com/QuoDcNj.png) ![](https://i.imgur.com/n5ASDLw.png) ![](https://i.imgur.com/ksJwUwA.png) ### 介面的繼承 * 不同於類別的是,介面可以同時繼承多個介面 :::info ```java= [public] interface 介面名稱 extends 繼承介面1, 繼承介面2 { // ... } ``` ::: 範例一: ![](https://i.imgur.com/qSdG8h9.png) ![](https://i.imgur.com/Xu3Yfr5.png) ![](https://i.imgur.com/zkCw8Xa.png) 範例二: ![](https://i.imgur.com/7LoJNGm.png) ![](https://i.imgur.com/YnLeBKt.png) ![](https://i.imgur.com/E0yqZhC.png) ## 抽象類別 * 含有抽象方法的類別 >* 由繼承的子類別實作抽象方法 >* 不一定要有抽象方法 * 無法建立物件 >無法用new關鍵字產生實體 :::info ```java= [public] abstract class 抽象類別名稱 { [public/protected] abstract 資料型態 抽象方法名稱 (參數列); ...... 成員變數 建構式 成員方法 ...... } ``` ::: 範例: ![](https://i.imgur.com/JK0agxH.png) ![](https://i.imgur.com/CRfjUrM.png) ![](https://i.imgur.com/jtSYiNU.png) 範例 (子類別可以繼承抽象類別並實作介面): ![](https://i.imgur.com/FLVpyaF.png) ![](https://i.imgur.com/F6aUigs.png) ![](https://i.imgur.com/Z0qeMEv.png) ## 常數類別 :::info ```java= final class 類別名稱 ``` ::: * final + 變數 >> 常數 * final + 方法 >> 不可被覆寫 * final + 類別 >> 不可被繼承 範例: ![](https://i.imgur.com/LGvLH5x.png) ![](https://i.imgur.com/d8km0Dw.png) >參考資料: >* [D2:[Java]類別的繼承(基本範例解說)](https://ithelp.ithome.com.tw/articles/10184771) >* [第15課 類別的繼承 抽象類別](https://github.com/tomlinNTUB/Java/wiki/%E7%AC%AC15%E8%AA%B2-%E9%A1%9E%E5%88%A5%E7%9A%84%E7%B9%BC%E6%89%BF-%E6%8A%BD%E8%B1%A1%E9%A1%9E%E5%88%A5) >* [D9:[Java]抽象類別(基本範例解說)](https://ithelp.ithome.com.tw/articles/10184934) >* [[Java]介面與抽象類別的比較](http://rx1226.pixnet.net/blog/post/343020565-%5Bjava%5D-19-5-%E4%BB%8B%E9%9D%A2%E8%88%87%E6%8A%BD%E8%B1%A1%E9%A1%9E%E5%88%A5%E7%9A%84%E6%AF%94%E8%BC%83)