定義:能夠將一個類的定義放在另外一個類的定義內部java
做用: 每一個內部類都能獨立地繼承一個(接口的)實現,因此不管外圍類是否已經繼承了某個(接口的)實現,對於內部類都沒有影響。函數
同時若是咱們須要建立某個內部類對象,必需要利用外部類的對象經過.new來建立內部類: OuterClass.InnerClass innerClass = outerClass.new InnerClass();this
內部類是個編譯時的概念,一旦編譯成功後,它就與外圍類屬於兩個徹底不一樣的類。code
在Java中內部類主要分爲成員內部類、局部內部類、匿名內部類、靜態內部類。對象
1. 成員內部類繼承
它是外圍類的一個成員,該內部類能夠訪問外部類的全部成員和方法,即便是private. 可是外圍類要訪問內部類的成員屬性和方法則須要經過內部類實例來訪問。接口
2. 靜態內部類內存
該類被修飾爲static。,他不能訪問外部類非靜態的成員或方法。編譯
建立靜態內部類對象時,能夠直接建立 內部類 對象名 = new 內部類();class
若是外部類的靜態成員與內部類相同時,能夠經過類名.靜態成員訪問外部類靜態成員若是不相同,能夠 「成員名」直接調用外部類的靜態成員。
public class textneibulei { int x = 9; class Inner{ int x = 8; public void test(){ int x = 7; System.out.println(x); System.out.println(this.x); System.out.println(textneibulei.this.x); test1(); } } private void test1(){ System.out.println("test"); } public static void main(String[] args) { Inner in = new textneibulei().new Inner(); in.test(); } }
輸出爲:7,8,9,test 分析:第七行第八行相信你們都沒有什麼問題,第九行輸出的是9,說明訪問到了外部類的變量,而輸出的test說明內部類訪問到了外部類的test1方法 總結: 輸出是9的緣由:由於內部類持有一個外部類的引用,格式:外部類名.this 能夠調用private方法緣由是:由於他們在一個類Outer中因此能夠調用
3. 方法內部類
能夠訪問外部類成員,不能被 public 、protected、private以及 static 修飾。
只能訪問方法中定義的 final 類型的局部類型變量。
內部類訪問外部方法中的局部變量時,該局部變量變量須要被修飾成 final 。
4. 匿名內部類
使用名匿名內存類時,必須實現一個接口或者繼承一個類。
匿名內部類中不能定義構造函數,不能存在任何靜態成員和靜態方法。