1)位置:
內部類是定義一個類的裏面或者一個方法中,或者一個表達式中。
頂層類是定義在package下
2)修飾符:頂層類只能處於public和默認訪問級別,
成員內部類能夠處於public, protected, private和默認這4種訪問級別;java
1)能夠避免命名衝突。
2)定義類的範圍從package變成了類。在一個類的內部定義的類稱爲內部類。
3)進行再一次的封裝
4)分擔外圍類的功能this
變量按照做用域可分爲:
1) 成員變量: 實例變量、靜態變量;
2) 局部變量;
一樣,內部類按照做用域可分爲;
1) 成員內部類: 實例內部類、靜態內部類;
2) 局部內部類;放在方法裏
3) 匿名內部類code
靜態內部類具備如下特色:
1)靜態內部類能夠直接訪問外部類的靜態資源。若是靜態內部類中的變量名字和外圍類的變量名字相同,須要指定訪問時的誰的名字。
2)靜態內部類若是訪問外部類的實例成員,
就必須經過外部類的實例去訪問。
3)靜態內部類的實例不會自動持有外部類的特定實例的引用,
在建立靜態內部類的實例時,沒必要建立外部類的實例。
4)在靜態內部類中能夠定義靜態成員和實例成員。
5)外圍類能夠經過完整的類名直接訪問靜態內部類的靜態成員。
6)外圍類能夠經過內部類對象調用靜態內部類對象的非靜態成員。
7)在靜態內部類中和外圍類中建立靜態內部類的對象:對象
靜態內部類類名 m=new 靜態內部類類名();接口
在其餘類中建立靜態內部類的對象:生命週期
外圍類.靜態內部類類名 m= new 外圍類.靜態內部類類名();事件
特色:
1)在內部類中,能夠直接訪問外部類的全部資源(屬性和方法)。
2)成員內部類不能定義靜態的資源,只能定義非靜態的資源。
3)外圍類不能直接訪問成員內部類的資源.先建立成員內部類的對象,在經過調用非靜態資源(對象.資源).
4)在成員內部類中和外圍類中建立成員內部類的對象成員內部類中:資源
類名 m=new 成員內部類類名();作用域
外圍類中:class
類名 m=this.new 成員內部類類名();
在其餘類中建立成員內部類的對象:
外圍類.成員內部類類名 m=new 外圍類().new 成員內部類類名();
5)在建立實例內部類的實例時,外部類的實例必須已經存在。
6)在成員內部類中調用外圍類中同名資源:
外圍類.this.資源
7)若是實例內部類B與外部類A包含同名的成員,
那麼在類B中,this.v表示類B的成員, A.this.v表示類A的成員
8)實例內部類的實例自動持有外部類的實例的引用。
9)外部類實例與內部類實例之間是一對多的關係,一個內部類實例只會引用一個外部類實例,而一個外部類實例對應零個或多個內部類實例。
特色:
1)局部內部類只能在當前方法中使用。
2)局部內部類和實例內部類同樣,不能包含靜態成員。
3)在局部內部類中定義的內部類也不能被public、
protected和private這些訪問控制修飾符以及static修飾(都是局部的);
4)能夠訪問外部類的全部成員。
5)局部內部類還能夠訪問所在方法中的final類型的局部變量。final延長局部變量的生命週期。
特色:
1)沒有類名,使用接口或者抽象類代替類名
2)訪問外圍類的一切資源(方法和屬性)
3)訪問該方法final修飾的局部變量,jdk1.8之後不須要
4)放在方法中或者做爲參數。
幾種內部類的區別:
a. 聲明的位置:
靜態內部類:類的內部,方法的外部,用static關鍵字修飾;
實例內部類:類的內部,方法的外部,不用static關鍵字修飾;
局部內部類:方法的內部;
匿名內部類:既能夠在類的內部,方法的外部,也能夠在方法的內部;
b. 實例化方式: 靜態內部類:new Outer.Inner(); //在外部類外建立; new Inner(); //在外部類內內部類外建立 實例內部類:new Outer().new Inner(); //在外部類外建立; this.new Inner(); //在外部類內內部類外建立 局部內部類:new Inner(); //只能在方法內部建立 匿名內部類:new 類名() {};
//成員內部類,靜態內部類 StaticInnerTest.class StaticInnerTest$MaxMin.class //局部內部類 LocalInnerTest.class LocalInnerTest$1MaxMin.class //匿名內部類 AnonymousInnerTest.class AnonymousInnerTest$1.class
圖形化界面中組件的監聽事件工廠模式,在內部類只有在該外圍類有意義,出了該外圍類就沒有意義了, 就能夠將該類定義成內部類。