考虑以下类:
public class Main {
private int x1;
public static int x2;
static class A {
private int x3;
static private int x4;
class B {
void f() {
System.out.println( ? x ? )
}
}
}
}
问题是:
{x1,x1,x3,x4}的哪个可以代替?x?班级编译?
起初,我认为只有x2和x4才能起作用,因为它们是其包含类的静态数据成员,因此,它们被保存在堆上并分配了默认值为0,因此访问它们应予以编译。但是,正确的答案是x2,x4和x3。我的问题是,X3是否也分配了默认值,是静态类的成员?这些情况的规则是什么?
所有成员变量均分配为默认值。如果您的实际问题是,为什么在打印语句中插入x3
时代码会编译,这是因为class B
是class A
的内部类。因此,无论class A
是否是静态类,class A
的字段都可以在class B
内访问。
我的问题是,x3是否分配了默认值
是。创建实例时,为实例变量(又称字段(分配了默认值。无论课堂是什么样的班级,这都是事实。它与A
是静态嵌套类无关的。
它也发生在这里:
public class Example {
private int x;
void f() {
System.out.println(this.x); // 0
}
}
x1
不是有效的选项的唯一原因是它是Main
中的实例变量,而B.f
没有任何Main
实例可以访问x1
。B
中的代码对A
实例有隐式引用,它是(B
是内部类(的一部分,但是A
没有对Main
的任何实例的隐式引用,因为它不是内部类,它是静态的嵌套类别类别。如果将Main
的实例传递到A
或B
中的代码中,则可以访问该实例的x1
,但是它需要Main
的明确实例,没有隐含的一个。