在下面的代码中,我假设成员变量mBar
只会在第一次构造Foo
对象时被实例化...并且这个mBar
实例化将会与所有未来的Foo
对象共享,但不会再次调用Bar()
构造函数。这准确吗?
public class Foo {
private static Bar mBar = new Bar();
public Foo() {
}
答案 0 :(得分:6)
实际上可以在创建第一个Foo之前构造对象。它将在Classloader在内存中加载Foo.class时执行。这可能在任何时候都会发生....特别是当你加载其他类时使用Foo类,或者当你调用类的静态方法时....
答案 1 :(得分:4)
几乎,当首次加载类 Foo时,它会被实例化。因此,如果您调用Foo.mBar(如果它是公共的),您将获得bar实例,即使没有实例化Foo的实例。
答案 2 :(得分:-1)
您的假设大多是准确的。 mBar只为该类的所有实例(在同一进程中)初始化一次。请注意,这不会阻止任何其他类调用Bar构造函数...
编辑:正如评论中所指出的,它不一定是第一次构建Foo对象;它是对Foo对象的第一个执行引用,它将导致类加载器初始化静态成员(从而调用Bar())。