考虑以下课程:
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是否也被分配了默认值,是静态类的成员?这些案件的规则是什么?
答案 0 :(得分:3)
为所有成员变量分配一个默认值。如果您的实际问题是,为什么在print语句中插入x3
时编译代码,那是因为class B
是class A
的内部类。因此class A
的{{1}}字段可以在class B
内访问,无论class A
是否为静态类。
答案 1 :(得分:1)
我的问题是,x3也分配了一个默认值
是。在创建实例时,为实例变量(aka域)分配默认值。无论班级是什么类,都是如此。它与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
的显式实例},没有隐含的。