Java-JVM 类的初始化

public class Test {
    protected static final Logger logger = LoggerFactory.getLogger(Test.class);

    public static void main(String[] args) {
        Singleton singleton = Singleton.getInstance();
        logger.info("counter1:" + singleton.counter1);
        logger.info("counter2:" + singleton.counter2);
    }
}

class Singleton {
    private static Singleton singleton = new Singleton();
    public static int counter1;
    public static int counter2 = 0;

    private Singleton() {
        counter1++;
        counter2++;
    }

    public static Singleton getInstance() {
        return singleton;
    }
}

 

Singleton singleton = Singleton.getInstance();这行代码首先给Singleton中的变量赋予默认的初始值:

即:private static Singleton singleton的singleton赋予默认初始值null、

public static int counter1 的counter1赋予默认初始值0、

public static int counter2 的counter2赋予默认初始值0(不是显式的0)、

然后会显式地给变量赋值:

private static Singleton singleton的singleton赋予new Singleton(),此时会执行Singleton类的构造函数:

 

 

private Singleton(){

counter1++;

counter2++;

}

counter1 = 1;

counter2 = 1;

接着给counet1、counter2显式赋值

 

public static int counter1 ;

public static int counter2 = 0;

由于counter1没有显式值

所以赋值完成后counter1 = 1、counter2 = 0;

最后输出为counter1 = 1、counter2 = 0;

 

 

如果把 private static Singleton singleton = new Singleton();放在 public static int counter2 = 0;的后面,则会输出counter1 = 1、counter2 = 1;

posted @ 2018-05-04 15:47  8932809  阅读(136)  评论(0编辑  收藏  举报