繁体   English   中英

Static 初始化

[英]Static Initialization

我在编译代码时遇到了问题。 当我编译我的代码 foo2.var 在 class foo 中返回 null 时,我似乎不知道为什么。 Is there something wrong in how I'm doing the static initialization in the foo2 class to cause foo2.var to be null in the foo class?

任何帮助表示赞赏。

public class foo extends bar {
  public final static String blah = foo2.var;
  ...
}

public abstract class bar {
  ...
}

public class foo2 extends bar {
  public final static String var;

  static {
    var = "newstring";
  }
  ...
}

Null 本例中 foo2.var 行的指针错误。

您尚未为var指定类型,请尝试使用public final static String VAR;

然后为什么不只是

public class foo2 extends bar {
  public final static String var = "newstring";

var没有类型。 按照惯例,Java中的常量也是大写的。 做了:

public class Foo2 {
  public final static String VAR;

  static {
    VAR = "newstring";
  }
  ...
}

访问静态字段(其值不是编译时常数表达式)将触发声明该字段的类的初始化,在此期间将执行静态初始化程序。 但是,只有在初始化程序之间没有循环依赖性的情况下,才可以保证在读取字段时完成初始化。

例如,如果您运行该程序

class Bar {
    static final long bar;

    static {
        System.out.println("Assigning bar");
        bar = Foo.foo;
    }
}
class Foo extends Bar {
    static final long foo;

    static {
        System.out.println("Assigning foo");
        foo = 1;
    }
}

public class Test {
    public static void main(String[] args) {
        new Foo();
        System.out.println(Bar.bar);
    }
}

您得到以下输出:

Assigning bar
Assigning foo
0
1

因为创建的新实例FooFoo.class被初始化,它首先初始化其超类Bar.class ,其内容的领域Foo.class ,但Foo.class已经被初始化。 Java语言规范在第12.4.2节的第3步中要求这种递归初始化立即完成,即,调用者将看到该类处于部分初始化状态。 也就是说,在读取Foo.fooFoo.foo进行分配,因此仍包含默认值0。该值分配给Bar.bar ,从而完成Bar.class初始化。 然后,通过运行初始化程序(将Foo.foo设置为1)来恢复Foo.class的初始化。

实际上,您可能希望查看类的依赖关系并构造程序,以使初始化程序之间没有循环依赖关系。

您缺少var的类型,将该行更改为以下内容:

public final static String VAR;

指定var类型。

同样,通过编码约定,类名称应使用CamelCase和常量UNDERSCORED_CAPS编写

public class Foo2 {
   public final static VAR = "newstring"; // why not?
...
}

另外,您可以通过一些变量来遮盖foo2类。 检查您的进口。 因为类静态字段引用不能产生NPE!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM