内部类

内部类

所谓内部类,就是定义在一个类内部的类。

引入内部类,主要有以下一些考虑:

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

我是匿名内部类

 

 

你可能感兴趣的:(接口,关键字,public)