內部類
所謂內部類,就是定義在一個類內部的類。
引入內部類,主要有以下一些考慮:
1內部類對象能訪問它所處類的私有數據
2.內部類能夠隱藏起來不爲同一個包中的其他類訪問
3.匿名內部類可以方便的用在回調方法中,典型應用是圖形編程中的事件處理。
內部類分爲以下4種:
1. 成員內部類
2. 靜態內部類
3. 局部內部類
a) 局部內部類之中,只能訪問外部類的成員變量和final修飾的局部變量。
4. 匿名內部類:一種特殊的局部內部類
a) new + 父類/父接口的形式創建。
b) 四無二有:沒有類名、沒有class關鍵字、有繼承關係但是沒有繼承關鍵字extends、沒有構造方法、有類體。
首先說一下成員內部類:
publicclass TestMemberInner { privateintage; public TestMemberInner(){ A a = new A(); a.testA(); } publicvoid test(){ A a = new A(); a.testA(); } publicclass A{ publicvoid testA(){ System.out.println("我是成員內部類"); } } publicstaticvoid main(String[] args) { TestMemberInner tmi = new TestMemberInner(); tmi.test(); // 以下用法不常用 A a = tmi.new A(); a.testA(); } } |
執行結果: 我是成員內部類 我是成員內部類 我是成員內部類 |
靜態內部類和成員內部類很像,只要在class A前面加上static就可以了。
下面說一下局部內部類:
publicclass TestLocalInner { privateinti = 10; publicvoid test(){ finalint j = 10; class A{ publicvoid testA(){ System.out.println(i); System.out.println("我是局部內部類"); System.out.println(j); } } System.out.println(j); A a = new A(); a.testA(); } publicstaticvoid main(String[] args) { new TestLocalInner().test(); } } |
執行結果: 10 10 我是局部內部類 10 |
說明:我們可以看到局部內部類是定義在方法中的,而且只能訪問外部類的成員變量就行程序中的i一樣,如果j前面不加final修飾也是不能訪問的。
接下來是匿名內部類:
publicclass TestAnnoInner { publicvoid test(A a){ a.testA(); }
publicvoid method(){ finalint i = 10; test(new A(){ publicvoid testA(){ System.out.println(i); System.out.println("我是匿名內部類"); } }); } publicstaticvoid main(String[] args) { new TestAnnoInner().method(); } }
interface A{ publicabstractvoid testA(); } |
執行結果: 10 我是匿名內部類 |