接口與內部類

                         [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是最終的, 可以用來修飾類, 方法, 變量 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章