这道题想考察什么?
掌握static的作用与注意事项
考察的知识点
Java中关键字static
考生应该如何回答
在定义内部类时,如果内部类被static声明,则该内部类为静态内部类。
public class OuterClass{
static class InnerClass{
}
}
当内部类被static声明,那么在内部类中就无法直接使用外部类的属性。比如编写普通内部类:
public class OuterClass{
int i;
public class InnerClass{
public InnerClass(){
i = 10;
}
}
}
此时对OuterClass.java 进行编译,会生成:OuterClass.class 与 OuterClass$InnerClass.class 两个文件。对后者反编译我们将看到:
public class OuterClass$InnerClass {
public OuterClass$InnerClass(OuterClass var1) {
this.this$0 = var1;
var1.i = 10;
}
}
可以看到,普通内部类构造方法中实际上会隐式的传递外部类实例对象给内部类。在内部类中使用外部类的属性:i。实际上是通过外部类的实例对象:var1获取的。同时如果我们需要构建出InnerClass
的实例对象,非静态内部类也无法脱离外部类实体被创建。
下面我们将InnerClass定义为static静态内部类:
public class OuterClass{
int i;
public static class InnerClass{
public InnerClass(){
//i = 10;
}
}
}
此时无法使用外部类的普通成员属性:i。其对应字节码为:
public class OuterClass$InnerClass {
public OuterClass$InnerClass() {
}
}
静态内部类中不再隐式的持有外部类的实例对象。但是如果我们将属性i定义为static,那么在静态内部类中也是可以直接使用外部类的静态成员属性的,此时字节码为:
public class OuterClass$InnerClass {
public OuterClass$InnerClass() {
OuterClass.i = 10;
}
}
内部静态类不需要有指向外部类的引用。但非静态内部类需要持有对外部类的引用。但是静态内部类能够直接利用new OuterClass.InnerClass()
实例化。
因此静态内部类与非静态内部类的区别有:
- 非静态内部类能够访问外部类的静态和非静态成员,静态类只能访问外部类的静态成员。
- 非静态内部类不能脱离外部类被创建,静态内部类可以。