内部类小结

内部类

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

为什么要定义内部类呢?

主要有以下几方面的考虑:

(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

我是匿名内部类。

 

 

 

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(内部类)