內部類
所謂內部類,就是定義在類內部的類。
爲什麼要定義內部類呢?
主要有以下幾方面的考慮:
(1) 內部類對象能訪問它所處類的私有數據;
(2) 內部類能夠隱藏起來不爲同一個包中的其他類訪問;
(3) 內部類可以方便的用在回調(callback)方法中;
主要有四種內部類:
(1) 成員內部類
(2) 局部內部類
(3) 匿名內部類
(4) 靜態內部類
1成員內部類
定義在類內部,和類中的屬性是一個級別。
package day05.inner; /** * 成員內部類 */ public class TestMemberInner { private int age = 20; //構造方法調用成員內部類的testA();方法 public TestMemberInner() { A a = new A(); a.testA(); } public void test() { A a = new A(); a.testA(); } //成員內部類 public class A { public void testA() { System.out.println("我是成員內部類"); System.out.println(++age); } } public static void main(String[] args) { //測試。創建一個TestMemberInner類 TestMemberInner tmi = new TestMemberInner(); //調用test();方法 tmi.test(); // 以下用法不常用 A a = tmi.new A(); a.testA(); } }
輸出結果:
我是成員內部類
21
我是成員內部類
22
我是成員內部類
23
2.靜態內部類
和成員內部類基本一樣,只是在成員內部類加上一個static 即可。
3局部內部類
定義在類的方法體中的類。
注意:只能訪問外部類的成員變量和final修飾的局部變量。
package day05.inner; public class TestLocalInner { //成員變量 private int i = 10; public void test() { //局部變量 final int j = 10; class A { public void testA() { //可以訪問外部類的成員變量i System.out.println("I:"+i); System.out.println("我是局部內部類"); //只能訪問final修飾的局部變量 System.out.println("J:"+j); } } System.out.println("J:"+j); //調用類A的testA();方法 A a = new A(); a.testA(); } public static void main(String[] args) { //創建類TestLocalInner並調用其內部類方法 new TestLocalInner().test(); } }
輸出結果:
J:10
I:10
我是局部內部類
J:10
4匿名內部類
適用於創建值需要使用一次的類。創建匿名內部類時會立即創建一個該類的實例,這個類的定義立即消失,匿名內部類不能重複使用。其格式如下:
new 父類構造方法(參數列表)實現接口{
//匿名類的主題部分
}
四無二有:沒有類名、沒有class關鍵字、有繼承關係但是沒有繼承關鍵字extends、沒有構造方法、有類體。
注意:
(1) 匿名內部類不能是抽象類,因爲系統在創建匿名內部類的時候,會立即創建匿名內部類的對象。因此不允許將匿名內部類定義成抽象類。
(2) 匿名內部類不能定義構造方法,因爲匿名內部類沒有類名,所以無法定義構造方法,但匿名內部類可以定義實力初始化塊,通過初始化塊來完成構造方法要完成的工作。
package day05.inner; /** * 匿名內部類 */ public class TestAnnoInner { public void test(A a) { a.testA(); } public void method() { final int i = 10; //匿名內部類new+父類/接口的形式創建,實現接口A test(new A() { //內部類中的testA()方法 public void testA() { //訪問final修飾的局部變量 System.out.println("I:"+i); System.out.println("我是匿名內部類。"); } }); } public static void main(String[] args) { new TestAnnoInner().method(); } } interface A { public abstract void testA(); }
輸出結果:
I:10
我是匿名內部類。