关于静态成员变量的问题

时间:2011-06-30 22:26:56

标签: java static static-members

在下面的代码中,我假设成员变量mBar只会在第一次构造Foo对象时被实例化...并且这个mBar实例化将会与所有未来的Foo对象共享,但不会再次调用Bar()构造函数。这准确吗?

public class Foo {
  private static Bar mBar = new Bar();

  public Foo() {

  }

3 个答案:

答案 0 :(得分:6)

实际上可以在创建第一个Foo之前​​构造对象。它将在Classloader在内存中加载Foo.class时执行。这可能在任何时候都会发生....特别是当你加载其他类时使用Foo类,或者当你调用类的静态方法时....

答案 1 :(得分:4)

几乎,当首次加载 Foo时,它会被实例化。因此,如果您调用Foo.mBar(如果它是公共的),您将获得bar实例,即使没有实例化Foo的实例。

答案 2 :(得分:-1)

您的假设大多是准确的。 mBar只为该类的所有实例(在同一进程中)初始化一次。请注意,这不会阻止任何其他类调用Bar构造函数...

编辑:正如评论中所指出的,它不一定是第一次构建Foo对象;它是对Foo对象的第一个执行引用,它将导致类加载器初始化静态成员(从而调用Bar())。