是否为静态类的所有字段分配了默认值?

时间:2018-02-10 14:41:23

标签: java

考虑以下课程:

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是否也被分配了默认值,是静态类的成员?这些案件的规则是什么?

2 个答案:

答案 0 :(得分:3)

为所有成员变量分配一个默认值。如果您的实际问题是,为什么在print语句中插入x3时编译代码,那是因为class Bclass 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的实例传递到AB中的代码,则它可以访问该实例的x1,但它需要Main的显式实例},没有隐含的。