---
# System prepended metadata

title: 'Java Advanced:'
tags: [Java, ' Interface', ' Abstract']

---

---
tags: Java, Abstract, Interface
---
# Java Advanced:

## :memo: todo list

1. Review inheritance
2. Abstract
3. Interface

    *前情提要：
    本章節絕對難懂，抽象和介面就像他的名稱一樣很抽象．
    這些概念會在大型專案及設計模式中（Design Pattern）被使用到。
    初學程式只需要搞懂繼承就很足夠了，未來如果有機會接觸到大型專案會再重新複習一次，目前聽不懂沒關係，大概知道是什麼意思就好。*

### 1. Review inheritance 
https://hackmd.io/Kiv76jeTQninqOLUZK0fOw

### 2. Abstract 
    抽象就像是設計稿
abstract關鍵字，用於類別和方法 ：

**Abstract Class**：是一個受限制的類別，不能用於創建物件（要使用它的內部成員，必須由另一個類別繼承）。

**Abstract Function**：只能在Abstract Class中使用，它沒有方法內容。內容皆由子類別（繼承的類別）來定義。

**為什麼以及何時使用抽像類別和抽象方法？**
實現安全性 - 隱藏某些細節並僅顯示物件的重要細節。


**程式範例：**

https://github.com/hryjosn/java_class_tutorial/tree/main/Tutorial_class/src/abstractExample


舉例:
```假設你今天要做個遊戲，那麼為了遊戲需要而生成的對象(不是管理系統，就是遊戲層別的那種，比如魔王和小怪)，這些對象他們可能都會有個共通點，比如魔王和主角和小怪他們可能都需要被畫出來，也有可能都需要被調查他們的屬性，換句話說，他們有共通點但實作方法又不同，就可以用抽象類別來規範。```

參考：https://www.mobile01.com/topicdetail.php?f=512&t=2971459
### 3. Interface（介面）

可以把Interface 想像成是一個完全的抽象類別，雖然他可以定義資料成員（String, int....），但他的function 都必須是abstract，也就是說他的所有function都必須被覆寫．
Interface Class有幾個特點：
* 和Abstract一樣，不能被用於創建物件
* 可以實現多重繼承（但關鍵字必須用implements,使用逗點隔開多個介面）
* 介面的function被預設是 public 且 abstract
* 介面不能有建構元
**程式範例：**

https://github.com/hryjosn/java_class_tutorial/blob/main/Tutorial_class/src/InterfaceExample/Main.java

比較：
**抽象與介面作比較，明顯可以看到抽象類別不止可以實現抽象方法，更可以包含商業邏輯與私人屬性。**

    介面與抽象類別在 OO 中有著重要的作用，可以降低程式的耦合與重複，增加彈性
練習題：
![](https://i.imgur.com/mkiKkKt.jpg)


*Java 不能多繼承類別，但可以實作多個介面（類似多繼承），但Ｃ語言可以多繼承*
*多繼承會發生鑽石問題，有興趣可以參考此篇文章:*

https://www.itread01.com/content/1550618849.html