有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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中的输出不同


共 (2) 个答案

  1. # 1 楼答案

    因为在第一种情况下,构造了一个Foo对象,但在第二种情况下,构造了两个Foo对象

    静态初始化sigleton字段——因此在加载类时,总是调用Foo构造函数(正如您为字段初始化器指定的那样)

    现在在案例1中,您只需调用一个方法,该方法返回已构造的sigleton对象,因此不会调用其他构造函数。在案例2中,您显式地构造了一个新的Foo对象,但仍然会构造sigleton。因此,在后一种情况下,将创建两个对象,构造函数总共运行两次,因此count1count2将多运行一次

  2. # 2 楼答案

    在案例2中,构造函数Foo()被调用了两次,一次是在初始化private static Foo时,另一次是从主方法调用。如果使用getInstance()方法获取Foo,则不会发生第二次调用