---
# System prepended metadata

title: Java--繼承、介面與抽象類別
tags: [Java]

---

---
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)

