java初始化构造函数中的静态变量
请看以下代码:
public class Foo {
private static Foo sigleton=new Foo();
private static int count1;
private static int count2=0;
private Foo (){
count1++;
count2++;
}
public static Foo getInstance(){
return sigleton;
}
public static void main(String[] args) {
//Foo f= Foo.getInstance(); // case 1
//Foo f= new Foo(); // case 2
System.out.println(f.count1);
System.out.println(f.count2);
}
}
对于每次运行,取消对main方法中的一行的注释
为什么案例1和案例2中的输出不同
# 1 楼答案
因为在第一种情况下,构造了一个
Foo
对象,但在第二种情况下,构造了两个Foo
对象静态初始化
sigleton
字段——因此在加载类时,总是调用Foo
构造函数(正如您为字段初始化器指定的那样)现在在案例1中,您只需调用一个方法,该方法返回已构造的
sigleton
对象,因此不会调用其他构造函数。在案例2中,您显式地构造了一个新的Foo
对象,但仍然会构造sigleton
。因此,在后一种情况下,将创建两个对象,构造函数总共运行两次,因此count1
和count2
将多运行一次# 2 楼答案
在案例2中,构造函数
Foo()
被调用了两次,一次是在初始化private static Foo
时,另一次是从主方法调用。如果使用getInstance()
方法获取Foo,则不会发生第二次调用