什么是內(nèi)部類
定義在類結(jié)構(gòu)中的另一個(gè)類
為什么使用內(nèi)部類
增強(qiáng)封裝,內(nèi)部類隱藏在外部類中,其他類不能訪問
提高代碼的可讀性和可維護(hù)性
內(nèi)部類可以直接訪問外部類的成員
內(nèi)部類的分類
實(shí)例內(nèi)部類: 內(nèi)部類沒有使用static修飾
靜態(tài)內(nèi)部類: 內(nèi)部類使用了static修飾
局部?jī)?nèi)部類: 在方法中定義的內(nèi)部類
匿名內(nèi)部類: 適用于僅使用一次的類,數(shù)據(jù)一種特殊的局部?jī)?nèi)部類
外部類的訪問修飾符: 要么使用public,要么就缺省
內(nèi)部類可以看做是外部類的一個(gè)成員,可以使用public/缺省/protected/private修飾
實(shí)例內(nèi)部類:
? ? 沒有使用static修飾的內(nèi)部類,內(nèi)部類屬于外部類的對(duì)象,不屬于外部類本身
特點(diǎn):
? ? 創(chuàng)建內(nèi)部類時(shí)必須存在外部類對(duì)象,通過外部類對(duì)象創(chuàng)建的內(nèi)部類(如果存在內(nèi)部類,就一定存在外部類對(duì)象)? ? Outter.Inner in= Outter().new Inner();
? ? 實(shí)例內(nèi)部類的實(shí)例自動(dòng)的持有外部類的實(shí)例的引用,內(nèi)部類可以直接訪問外部類的成員
? ? 外部類不能直接訪問內(nèi)部類的成員,必須通過內(nèi)部類的實(shí)例去訪問
? ? 內(nèi)部類中不能定義靜態(tài)成員,只能定義實(shí)例成員
? ? 如果內(nèi)部類和外部類存在相同的字段或者方法(例: apple),那么在內(nèi)部類中: this.apple表示訪問內(nèi)部類的成員; 外部類.this.apple表示訪問外部類成員
靜態(tài)內(nèi)部類:
? ? 使用static修飾的內(nèi)部類
特點(diǎn):
? ? 靜態(tài)內(nèi)部類的實(shí)例不會(huì)自動(dòng)持有外部類實(shí)例的引用,在創(chuàng)建內(nèi)部類的時(shí)候不必創(chuàng)建外部類對(duì)象? ? Outter.Inner in = new Outter.Inner();
? ? 靜態(tài)內(nèi)部類可以直接訪問外部類的靜態(tài)成員,想要訪問外部類的實(shí)例成員,需要通過外部類的實(shí)例進(jìn)行訪問
? ? 靜態(tài)內(nèi)部類中可以定義靜態(tài)成員和實(shí)例成員
? ? 測(cè)試類可以通過完整的類名直接訪問靜態(tài)內(nèi)部類的靜態(tài)成員
局部?jī)?nèi)部類: (不建議使用)
? ? 在方法中定義的內(nèi)部類,和方法中的局部變量是一個(gè)級(jí)別的
特點(diǎn):
? ? 不能使用public,private,protected,static修飾符
? ? 局部?jī)?nèi)部類只能在方法里使用
? ? 局部?jī)?nèi)部類和實(shí)例內(nèi)部類一樣可以訪問外部類的所有成員
? ? 局部?jī)?nèi)部類和實(shí)例內(nèi)部類一樣不能包含靜態(tài)成員
? ? 局部?jī)?nèi)部類訪問的局部變量必須使用final修飾(在java8中是自動(dòng)隱式加上final,但依然是常量,不能改變值)
匿名內(nèi)部類:
? ? 匿名內(nèi)部類是沒有名稱的局部?jī)?nèi)部類,適合只使用一次的類
? ? 在javaSE和Android的事件處理中,不同的按鈕點(diǎn)擊之后會(huì)有不同的響應(yīng)操作,首先使用匿名內(nèi)部類
特點(diǎn):
? ? 匿名內(nèi)部類本身沒有構(gòu)造器,但是會(huì)調(diào)用父類的構(gòu)造器
? ? 匿名內(nèi)部類雖然沒有構(gòu)造器,但是可以在內(nèi)部類中提供一個(gè)實(shí)例初始化代碼塊,JVM在調(diào)用父類構(gòu)造器后,會(huì)執(zhí)行該代碼塊
? ? 內(nèi)部類不但可以繼承類,還可以實(shí)現(xiàn)接口
格式:
? ? new 父類構(gòu)造器([實(shí)參列表]) 或者 接口()
????{
? ? // 匿名內(nèi)部類的類體部分
????}
匿名內(nèi)部類有且僅繼承一個(gè)父類或者實(shí)現(xiàn)一個(gè)接口
每一個(gè)類都會(huì)生成class文件
成員內(nèi)部類: 外部類名$內(nèi)部類名
局部?jī)?nèi)部類: 外部類名$數(shù)字內(nèi)部類名
匿名內(nèi)部類: 外部類名$數(shù)字
<完>