[8]接口與內部類
一.接口
1.什麼是接口
接口是一種特殊的抽象類, 所有方法都是抽象的.
* 2.接口和抽象類的區別
抽象類用abstract class定義, 接口用interface定義
抽象類中可以有不抽象的方法, 接口中的方法全都是抽象的
抽象類使用extends繼承, 接口使用implements實現
抽象類中的方法沒有默認修飾符, 接口中的方法默認都是abstract public修飾的
抽象類中的成員變量沒有默認修飾符, 接口中的成員變量默認被public static final修飾
一個類只能繼承一個抽象類, 一個類可以實現多個接口
* 3.什麼時候用抽象類, 什麼時候用接口:
如果一個類所有方法都是抽象的, 那麼就用接口.
如果一個類中抽象方法和不抽象的方法全都需要, 那麼就定義爲抽象類.
4.什麼情況下一個類不能同時實現2個接口
兩個接口中有方法名, 參數列表相同, 但是返回值類型不同的方法.
5.什麼情況下會把子類類型強轉爲父類類型
當一個子類對象可以匹配多個重載的方法, 而多個方法中的形參是這個子類實現的不同的父類類型.
這時調用不明確, 因爲子類對象可以傳入多個方法, 需要強轉爲父類類型, 才能明確調用哪個方法.
二.內部類
1.什麼是內部類
在類中定義的類就是內部類
2.類中的內部類
a.什麼是類中的內部類
在一個類中定義另外一個類, 內部類是外部類的一個成員.
在創建內部類對象時, 必須先創建外部類對象. 然後通過外部類對象才能創建內部類對象.
創建對象的語法: 外部類名.內部類名 變量名 = new 外部類().new 內部類();
一個外部類對象可以有多個內部類對象, 一個內部類對象只能有一個外部類對象
b.什麼時候使用類中的內部類
當一個類需要訪問另一個類的成員時.
當創建一個類需要先創建另一個類的對象時.
c.內部類訪問外部類成員
可以使用"外部類名.this.成員名"形式訪問外部類對象的成員.
在方法中使用this, this代表調用當前方法的對象. "外部類名.this"代表調用當前方法的對象的外部類對象
外部類不能訪問內部類的成員
d.內部類中不能定義靜態成員
static的本意就是不創建對象就能直接使用,內部類的本意是必須創建外部類對象才能使用, 互相矛盾
3.方法中的內部類
a.什麼是方法中的內部類
內部類定義在方法中, 只能在當前方法中使用
b.方法中的內部類和類中的內部類的區別
只能在當前方法中使用, 定義類的代碼必須在使用類之前
c.方法中的內部類怎麼創建對象
在方法中直接使用 new 類名()
d.什麼時候用方法中的內部類
如果一個類只在某個方法中使用的時候
e.方法中的內部類怎麼訪問方法中的局部變量
這個局部變量必須是final的
* 4.匿名內部類
a.什麼是匿名內部類
匿名內部類也是方法中內部類的一種, 一個沒有名字的內部類
new 父類名() { 類定義 }
b.什麼時候使用匿名內部類
如果一個類只使用一次, 那麼就可以定義爲匿名內部類
c.匿名內部類的class文件名
外部類名$編號.class
5.靜態內部類
a.什麼是靜態內部類
用static關鍵字修飾的內部類, 可以不創建外部類對象直接使用, 可以定義靜態成員
b.靜態內部類和普通的類中內部類的區別
創建對象: 外部類名.內部類名 變量名 = new 外部類名.內部類名();
訪問外部成員: 不能訪問外部非靜態成員
定義靜態成員: 可以定義靜態成員
三.異常
1.什麼是異常
異常就是程序運行過程中出現的一些錯誤, 使用throw關鍵字拋出的一些對象.
可以通知調用處, 調用處下面的代碼不會再執行了.
2.異常的處理方式
a.聲明
在參數列表之後, 使用throws關鍵字聲明要拋出的異常, 這樣做在方法中出現了異常的時候, 該方法會將此異常繼續拋出給調用者
異常一旦拋出, 下面的代碼不再執行
b.捕捉
將有可能出現異常的代碼放在try代碼塊中, 使用catch關鍵字捕捉指定的異常, 當try代碼出現這個異常的時候, 就會執行catch中的代碼
異常如果被捕獲, try...catch代碼塊外面的代碼可以繼續執行
3.異常的分類
a.編譯時異常
Exception中除了RuntimeException的部分, 編譯之前在代碼中必須對其進行聲明或捕捉, 否則編譯報錯
b.運行時異常
RuntimeException或其子類, 在代碼中可以不對其進行處理, 編譯不報錯.
這類異常經常會出現, 例如數組索引越界, 空指針, 算數異常, 如果對其進行處理, 非常麻煩, 代碼可讀性也會下降.
4.多個異常的處理方式
a.聲明
throws後面可以聲明多個異常, 用","分割
b.捕捉
try代碼塊後面可以跟多個catch, 每個catch中指定要捕獲的異常
如果要捕獲的異常有子類和父類的關係, 子類要寫在父類的上面
5.子類重寫父類方法時注意的異常問題
子類不能比父類拋出更多的異常, 子類拋出的異常範圍要更小, 是父類異常的一個子集
如果父類沒有拋出任何異常, 那麼子類中的異常只能捕獲
6.finally的使用
finally是配合try使用的, 只要執行了try中的額代碼, finally中的代碼就一定會執行.
finally和finalize和final有什麼區別?
finally是必須執行的代碼
finalize是Object類中的一個方法, 這個方法默認在對象被銷燬之前執行
final是最終的, 可以用來修飾類, 方法, 變量