是分配默认值的静态类的所有字段



考虑以下类:

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 Bclass 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实例可以访问x1B中的代码对A实例有隐式引用,它是(B是内部类(的一部分,但是A没有对Main的任何实例的隐式引用,因为它不是内部类,它是静态的嵌套类别类别。如果将Main的实例传递到AB中的代码中,则可以访问该实例的x1,但是它需要Main的明确实例,没有隐含的一个。

最新更新