1、内部類有效地實作了實作細節的隐藏,特别是聲明為private的内部類,用戶端程式員因為沒有通路該類的權限,無法實作擴充。
2、除了定義在類中,内部類可以定義在各處:方法内、循環内、if條件判斷内等任何作用域内,但是該作用域外無法通路該類。
3、我認為内部類的精髓在于向上轉型。實作了某接口或者抽象類的内部類,其實用都是通過向上轉型,用戶端程式持有的其實是接口或者抽象類的類型。與普通的實作類不同的是,一般普通的實作類都是public類型,用戶端能夠通路該實作類,也就能随意的擴充(定義為final的類和方法除外),内部實作類無法通路,有效隐藏了實作細節。
其最吸引人的地方應該在于可以實作有限的多重繼承。例如:
- abstract class A{};
- abstract class B{};
- class C extends A{
- B makeB(){
- return new B(){
- //TODO:可以直接有B的實作
- };
- };
- }
采取迂回的戰術實作多重繼承,其實是組合的一種代替,大可在先構造一個繼承B的類D,然後把D組合到A中。
4、為什麼普通的内部類不能擁有static的字段和方法?
我認為不是不能,而是沒有必要。衆所周知,static字段和方法在什麼時候調入記憶體?在class第一次被load的時候。普通内部類什麼情況下才會被load?普通内部類必須依賴于外部類對象,隻有先執行個體化外部類對象,再執行個體化内部類,進而才能調用,這與普通的字段、方法何異?是以沒有必要。(普通類什麼時候第一次load,有2種情況:一是調用構造方法的時候,二是直接使用類調用靜态字段和方法的時候)
5、為什麼傳入内部類的變量必須聲明為final?
首先澄清一下,并非所有傳入内部類的變量都得聲明為final,隻有必須在内部類的方法中使用的變量才有這個限制。有一種情況,内部類中隻是調用基類的構造方法處理傳入的變量,這種情況就不必聲明為final。
回到問題上來,為什麼final?先轉到final這個關鍵字上來,它能夠保證被修飾的變量必須被初始化。推而廣之,即傳入内部類的變量都能夠被初始化。你可以反問一句,問什麼必須保證傳入内部類的變量都要初始化?那我就想反問一句,你會傳入一個毫無意義的參數到一個方法中嗎?如果你回答能,那我要恭喜你,你又得到重構的機會了。傳入一個毫無意義的變量,還不如到内部類中自己定義一個呢,何必多次一舉?
理清思路作答:傳入到内部類的變量是即插即用的,是以必須是被初始化的,final就是來當這個擔保人的。搞定!
6、一個疑問:内部類(非private)可以定義在接口内?這段代碼調不通哦!!
- public interface ClassInInterface {
- void sunshine();
- class InInterface() implements ClassInInterface{
- public void sunshine(){
- System.out.println("Today is sunshine!");
- }
- public static void main(String[] args){
- new inInterface().sunshine();
- }
- }
- }