使用和辛格尔顿计划静态报表的流程(Use and flow of Static statements

2019-07-02 12:23发布

我知道有很多关于Singleton模式的问题。 但在这里我想知道它的输出也可能讨论如何“静态”在Java中的作品。

public class Singleton {
    private static Singleton currentSingleton = new Singleton();

    public static Singleton getSingleton() { 
        return currentSingleton;
    }

    private Singleton() {
        System.out.println("Singleton private constructor...");
    }

    public static void main(String[] args) {
        System.out.println("Main method...");
    }

}

这是从运行代码的输出...

辛格尔顿私有构造...
主要方法...

当我调试的代码,控制首先去行System.out.println("Singleton private constructor...")并打印。 (私有静态变量currentSingleton仍是空在这一点上)
然后转到行
private static Singleton currentSingleton = new Singleton(); 然后初始化私有变量。 然后,在最后,它进入main()方法和印刷品。

我的问题是:

  1. 为什么它首先打印“辛格尔顿私有构造......”这是私人的构造函数。 我想控制就应该先去看main()方法,因为它是入口点。 另外,我没有在任何地方创建任何实例(除变量初始化)。
  2. 后来它进入静态变量实例线(currentSingleton = NULL在这一点上)
    private static Singleton currentSingleton = new Singleton(); 虽然currentSingleton这里得到一个值,为什么构造函数不会再次叫什么名字?

主要是我想知道这个程序的控制流。

Answer 1:

你不能调用的主要方法在课堂上,直到它已经被正确初始化(即静态字段和静态块已被评估)。 当它被初始化,您的单例的实例是通过调用私有的构造函数创建。 后来的主要方法被调用。

有问题的类有一个静态字段到您assing的值。 由于场是静态的前级可以在任何上下文中使用,也就是说,它必须接收值时,它必须被初始化。 在这种情况下它的值恰好是同一类的一个实例。 这是类初始化期间什么触发你的私人costructor。

如果你想深入研究过程中,更好地理解它,请参阅的Java Laguage规范 。 更具体地讲在section12.4 类和接口的初始化 ,你会发现更多细节。



Answer 2:

每当控制涉及到任何类的第一次,所有的静态初始化首先发生。 这就是为什么你的静态对象被任何调用它的构造东西之前实例化。



Answer 3:

类被加载,并通过JVM的类加载器首先初始化。 和JVM在初始化,扫描类(单身),并同时做它初始化静态变量,这是在第一线。 该变量调用它的构造和打印线。 一旦类被初始化,它将调用的主要方法,因此打印出里面的语句。



Answer 4:

控制到达main()方法之前,这个类需要进行初始化。 既然你初始化currentSingleton与报关行内,这个初始化发生之前的main(),类加载过程。



Answer 5:

你还是把它声明为final

private static final Singleton currentSingleton = new Singleton();
  1. final类变量,其值是编译时间常数初始化界面领域

回答你的两个问题从JLS#8.3.2。 场的初始化

如果声明符为类变量(即,一个静态字段),则变量初始值被评估和分配精确的进行一次,当类(§12.4.2)初始化。



Answer 6:

new Singleton()语句将被执行,因为第一currentSingleton静态字段必须初始化; 这意味着正在创建存储器用于Singleton对象被分配并且其构造来分配所得到的物体领域的变量之前执行。 这是原因System.out.println("Singleton private constructor..."); 线的分配之前被执行。 此外静态字段初始化只要类被引用发生并调用Singleton类的主要功能是指参照它,这是初始化的主要方法之前执行的原因。



文章来源: Use and flow of Static statements in Singleton Program