Java内部类
大约 2 分钟
1、静态内部类与非静态内部类有什么区别?
- 静态内部类可以有静态成员(方法,属性),而非静态内部类则不能有静态成员(方法,属性)。
- 静态内部类只能够访问外部类的静态成员和静态方法,而非静态内部类则可以访问外部类的所有成员(方法,属性)。
- 实例化静态内部类与非静态内部类的方式不同
- 调用内部静态类的方法或静态变量,可以通过类名直接调用
2、静态内部类如何定义?
定义在类内部的静态类,就是静态内部类。
public class Out{
public static int a;
private int b;
public static class Inner{
public void print(){
System.out.println(a);
}
}
}
- 静态内部类可以访问外部类所有的静态变量和方法,即使是 private 的也一样。
- 静态内部类和一般类一致,可以定义静态变量、方法,构造方法等。
- 其它类使用静态内部类需要使用“外部类.静态内部类”方式,如下所示:Out.Inner inner = new Out.Inner();inner.print();
- Java集合类HashMap内部就有一个静态内部类Entry。Entry是HashMap存放元素的抽象,HashMap 内部维护 Entry 数组用了存放元
素,但是 Entry 对使用者是透明的。像这种和外部类关系密切的,且不依赖外部类实例的,都可以使用静态内部类。
3、什么是成员内部类?
定义在类内部的非静态类,就是成员内部类。成员内部类不能定义静态方法和变量(final修饰的除外)。这是因为成员内部类是非静态的,类初始化的时候先初始化静态成员,如果允许成员内部类定义静态变量,那么成员内部类的静态变量初始化顺序是有歧义的。
public class Out{
public static int a;
private int b;
public class Inner{
public void print(){
System.out.println(a);
}
}
}
4、Anonymous Inner Class(匿名内部类)是否可以继承其它类?是否可以实现接口?
可以继承其他类或实现其他接口,在 Swing 编程和 Android 开发中常用此方式来实现事件监听和回调。
5、内部类可以引用它的包含类(外部类)的成员吗?有没有什么限制?
一个内部类对象可以访问创建它的外部类对象的成员,包括私有成员。
6、是否可以从一个静态(static)方法内部发出对非静态(non-static)方法的调用?
不可以, 静态方法只能访问静态成员,因为非静态方法的调用要先创建对象, 在调用静态方法时可能对象并没有被初始化。