# ReviewDay 5
## 接口
### 接口是更加抽象的抽象類
- 接口不能被實(shí)例化
- 接口中所有的方法都是 *public* 方法
- 接口中的抽象方法可以不用abstract
- 接口的字段都是 *public static final* 的常量
- 除了抽象類筑公,實(shí)現(xiàn)接口的類必須實(shí)現(xiàn)接口的所有方法
### 接口與抽象類
- 每個(gè)類只能繼承一個(gè)類,但一個(gè)類可以同時(shí)實(shí)現(xiàn)多個(gè)接口
- 接口不能繼承其他的類蒸痹,但可以繼承多個(gè)別的接口
? > interface A extends B, C{}
- #### 實(shí)現(xiàn)接口與繼承類
? - 接口與繼承解決的問題不同
? ? > 繼承價(jià)值主要在于解決代碼的復(fù)用性和可維護(hù)性
>
? ? > 接口價(jià)值主要在于設(shè)計(jì)號各種規(guī)范冒萄,讓其他類實(shí)現(xiàn)這些方法
? - 接口比繼承更加靈活
? - 接口一定程度上實(shí)現(xiàn)代碼解耦
### 接口的多態(tài)特性
? - 多態(tài)參數(shù)
? - 多態(tài)數(shù)組
? - 多態(tài)傳遞(實(shí)現(xiàn)的接口實(shí)現(xiàn)了另一個(gè)接口)
## ~~lambda 表達(dá)式~~
## 內(nèi)部類
### 內(nèi)部類的分類
- 定義在外部類的局部位置(方法中窖逗、代碼塊)
? > (1)局部內(nèi)部類 (有類名)
>
? > (2)**匿名內(nèi)部類**(沒有類名)
- 定義在外部類的成員位置
? > (1)成員內(nèi)部類
>
? > (2)靜態(tài)內(nèi)部類 (static)
### 局部內(nèi)部類
- 可以直接訪問內(nèi)部類的所有成員,包括私有的
- 不能添加訪問修飾符,相當(dāng)于一個(gè)局部變量,但可以用final
- 作用域僅在定義它的方法或代碼塊
- 外部類和局部內(nèi)部類的成員重名時(shí)媒楼,要訪問外部類的成員時(shí)可以使用 (外部類名.this.成員)
### 匿名內(nèi)部類
- 既是一個(gè)類的定義,同時(shí)本身也是一個(gè)對象
- 可以直接訪問內(nèi)部類的所有成員戚丸,包括私有的
- 不能添加訪問修飾符划址,相當(dāng)于一個(gè)局部變量
- 匿名內(nèi)部類不能有構(gòu)造器,但可以提供對象初始化代碼塊
- 作用域僅在定義它的方法或代碼塊
- 外部**其他類**不能訪問匿名內(nèi)部類
- 常用于參數(shù)傳遞
```java
//基于類的匿名內(nèi)部類
Father father = new Father("jack") {
@Override
public void test() {
? ? ? ? //匿名內(nèi)部類重寫了方法
}
}
//基于抽象類的匿名內(nèi)部類
//基于接口的匿名內(nèi)部類
new Comparator() {
@Override
public int compare() {
? ? ? ? //重寫方法
}
}```
### 成員內(nèi)部類
- 成員內(nèi)部類定義外部類的成員位置限府,并且沒有static
- 可以添加訪問修飾符
- 作用域與其他成員變量一樣
- 外部類訪問成員內(nèi)部類時(shí)須創(chuàng)建對象再訪問
- 外部類和局部內(nèi)部類的成員重名時(shí)夺颤,要訪問外部類的成員時(shí)可以使用 (外部類名.this.成員)
### 靜態(tài)內(nèi)部類
- 定義于外部類的成員位置,并且有static修飾 (有static修飾的成員內(nèi)部類)
## 異常
### 執(zhí)行過程中所發(fā)生的異常事件可以分為兩大類
- Error(錯(cuò)誤):JVM無法解決的嚴(yán)重問題谣殊,如StackOverflowError和OOM
- Exception:因編程錯(cuò)誤或偶然的外在因素導(dǎo)致的一般性問題
? - 運(yùn)行時(shí)異常
? > 編譯器檢查不出來,一般是編程時(shí)的邏輯錯(cuò)誤
? - 編譯異常
? > 編譯器要求的必須處置的異常牺弄,否則不能通過編譯
? ![exception體系圖](http://pic.ruikai.ltd/img/202204101510019.png)
### 異常處理
- try-catch-finally
> 捕獲異常姻几,自行處理
? 1) 如果try塊中沒有出現(xiàn)異常,則執(zhí)行try塊中的所有語句势告,不再執(zhí)行catch塊蛇捌,若有finally,最后還要執(zhí)行finally塊中語句
? 2) 如果出現(xiàn)了異常咱台,則try塊中剩下的語句不在執(zhí)行络拌,將執(zhí)行catch塊,最后執(zhí)行finally塊
```java
try{
return 1;
} catch Exception e {
return 2;
} finally {
return 3;
}
? ? ? ? //try 塊中沒有出現(xiàn)異常回溺,catch塊不執(zhí)行春贸,因?yàn)橛衒inally塊中的return(finally必須執(zhí)行),所以finally中return執(zhí)行遗遵,try中return不執(zhí)行
try{
? ? ? ? ? ? //出現(xiàn)異常
return 1;
} catch Exception e {
return 2;
} finally {
return 3;
}
? ? ? ? //try 中出現(xiàn)異常萍恕,try中return不再執(zhí)行, 又因?yàn)閒inally有return车要,所以catch中return不執(zhí)行允粤,finally中return被執(zhí)行
try{
? ? ? ? ? ? //出現(xiàn)異常
return 1;
} catch Exception e {
int a = 1;
return a;
} finally {
a += 1;
}
? ? ? ? //try 中出現(xiàn)異常, catch被執(zhí)行翼岁,執(zhí)行到return時(shí)會(huì)將 a = 1保存為臨時(shí)變量 temp = 1;最后finally修改后再執(zhí)行catch塊中的語句类垫,并將臨時(shí)變量返回,而不是修改后的a```
- throws/throw
> 拋出異常琅坡,交給調(diào)用者處理
>
? >? throw和throws的區(qū)別
>? ![img](http://pic.ruikai.ltd/img/202204101535916.png)
-try-with-resources(帶資源的try語句)
```java
? ? ? ? try (Resource res = ...) //res實(shí)現(xiàn)了Closeable接口(AutoCloseable的子接口)
{
work with res ...
? ? ? ? }```
? > try 退出時(shí)悉患,會(huì)自動(dòng)調(diào)用res.close(),自動(dòng)關(guān)閉資源(無論是否出現(xiàn)異常)
>
? > try-with-resource也可以有catch、finally語句榆俺,這些語句將在資源被關(guān)閉后執(zhí)行
>
### 自定義異常
1) 自定義類繼承Exception或RuntimeException
2) 繼承Exception則屬于編譯異常
3) 繼承RuntimeException則屬于運(yùn)行異常
```java
class AgeException extends RuntimeException {
public AgeException(String message) {
super(message);
}
}```