java内部類
①内部類是在一個java類體内,再定義一個類,即外部類的内部再定義一個類(相對的)。
②内部類分為四類:
成員内部類、局部内部類、靜态内部類、匿名内部類
③内部類作為外部類的一個成員,并依附于外部類而存在。包括:成員内部類、局部内部類、匿名内部類
④内部類可以由private、public、protected、default通路修飾符和static修飾;
⑤而外部類,即和public類平行的,隻能有default修飾(空白修飾符),總之,由public和default通路修飾符修飾。
⑥ 内部類和外部類的執行個體變量可以共存,
内部類中通路執行個體變量:this.屬性。eg: this.age
内部類中通路外部類的執行個體變量:外部類名.this.屬性。innerclass.this.id
⑦内部類是一個編譯時的概念,編譯成功,就會成為完全不同的兩個類 eg:innerclass.class和innerclass$classx1.class
⑧内部類裡不能定義靜态的屬性和方法;
注:此處内部類(除靜态内部類外);
加載類時,靜态預設在記憶體中執行個體化的并存放。即可以直接調用不用手動執行個體化使用。内部類的執行個體化依賴于外部類,内部類不能直接被執行個體化,必須在外部類執行個體化後再執行個體化。
外部類public class或class是不能預設加載的,隻有調用new關鍵字手動執行個體化時才配置設定記憶體。
是以内部類不能定義靜态的屬性和方法。
所有代碼編譯圖為:
成員内部類:
測試類:
輸出結果:
inner1
成員内部類:4466*5555
外部類内部調用成員内部類:完畢!
編譯後的class位元組碼反編譯為:
innerclass類:
成員内部類classx1:
局部内部類:
此後外部類代碼,不變,替換内部類:
測試代碼:
此後,main中的代碼,其他省略:
代碼輸出為:
inner2
局部内部類預設構造方法在drawic中new時候執行
局部内部類對象調用getn2開始
局部内部類:lalala&4466$333
編譯後的innerclass類:
此後,隻替換變化代碼,其他不變:
編譯後的classx2類:
靜态内部類
輸出為:
inner3
靜态内部類:169shasha
編譯後:
class3類:
匿名内部類:
in接口:
ac抽象類:
inner4
匿名内部類:我實作了接口in的方法
inner5
匿名内部類:我擴充了抽象類ac的方法4466
接口實作匿名内部類:
抽象類實作類(匿名内部類)
注:最尾提供全部代碼
java多繼承方法(名)沖突
當類或接口或(抽象)父類,三個不同組合,發生方法(名)沖突的時候,此時必須使用内部類來解決。
匿名内部類、成員内部類
接口配合内部類,可以實作真正完全的多繼承。
接口in:
抽象類ac:
實作類innerclasssolvemultipleforacorin:
外部類實作接口in中的extend()方法1
成員内部類實作抽象父類ac中的extend()方法2
匿名内部類實作抽象父類ac中的extend()方法3
實作内部類,全部代碼:
内部類innerclass代碼:
測試test代碼:
inner4