---
# System prepended metadata

title: 繼承

---

# 繼承
- 父類別
    - 繼承使用`extends`，Java屬於單繼承
    ```java=
    public class FuClass{
   	 private int id;
	 private String name;
    }
    ```
- 子類別
    - 基本上都繼承Object
    - 繼承指定類別
        ```java=
        public class SuClass extends FuClass{

        }
        ```
    - 屬性會被繼承
    - 關於建構子的繼承
        - 如果子類別建構子初始化，要實作父類別建構子。如果父類別有多個建構子，子類別只要挑選其中一個（除非有需要用到其他數值才做多個）
- 補充：super有三種
    - super
        - 針對class
    - super()
    - super...
***
- 實際開發不太會直接運行空建構子
- 代碼塊建構子
```java=
//class下方
{       //比建構子還先運行
    
}


static{ //靜態形，順序最先，在他處new後只運行一次
    
}
```
- 實體化的過程是把某class提升到父類別的角色
```java=
public class AllClass {
	public void test01() {
        //一般類別的寫法
		Student st = new Student();
		getAll(st);
        
        //匿名類別的寫法
		getAll(new Worker());
		getAll(new Other());
	}

	public void getAll(FuClass fu) {
        //判斷來自哪裡才能印出來
        if (fu instanceof Student) {
			fu.eat();
			fu.sleep();
            
            //如果要用子類別的東西
            Student st=(Student)fu; //強轉自訂型態
			st.read();
		} else if (fu instanceof Worker) {
			fu.eat();
			fu.sleep();
            Worker wr=(Worker)fu;
            wr.work();
		} else if (fu instanceof Other) {
			fu.eat();
			fu.sleep();
		} else {
			fu.eat();
			fu.sleep();
	}

}
```
- 使用時機如：新增欄位（假設以前的檔案已編譯）
    - 以不更動原檔案為原則
    - `@Deprecated`過時備註
    - [範例](/8V1P_vhvQzyEzRgLwRZAZA)
- `@Override`可以覆寫父類別（右鍵Source中有快捷功能）
- 抽象類別 抽象方法
    - 抽象方法有方法頭無方法體
    - 使用==抽象的關鍵字==
    - 抽象方法==只能==放置於抽象類別中
        ```java=
        public abstract class Fuclass{//這是抽象類別
        public abstract void method();//這是抽象方法
        }
        ```
    - 抽象方法需要繼承並需要實作
        - Override
    - 可以用於連接多重資料庫
- 複習super用法
```java=
super.父類別中的方法();
```
- 如果都不想全部實作父類別中的抽象方法，可以讓class本身也變抽象的
- new一個抽象類別不好使，只能用其中一個方法（跟匿名類別差不多）
***
## 屬性議題
```java=
private int x;//只有範圍內能用
int y; //僅繼承、物件可用
protected int z; //僅繼承、物件可用
public int a;//其他package也能看到
```