內部類小結

內部類

所謂內部類,就是定義在類內部的類。

爲什麼要定義內部類呢?

主要有以下幾方面的考慮:

(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

我是匿名內部類。

 

 

 

 

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章