了解JVM加载实例化类的原理

 

class Singleton {
private static Singleton instance = new Singleton();
public static int a;
public static int b=0;

private Singleton() {
a++;
b++;
}

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


public class MAINTEST {
public static void main(String[] args) {
Singleton singleton = Singleton.getInstance();
System.out.println("a=" + singleton.a);
System.out.println("b=" + singleton.b);
}
}


public class MAINTEST {

public static void main(String[] args) {
Singleton singleton = Singleton.getInstance();
System.out.println("a=" + singleton.a);
System.out.println("b=" + singleton.b);
}
}











class Singleton {
public static int a;
public static int b=0;
private static Singleton instance = new Singleton();

private Singleton() {
a++;
b++;
}

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


public class MAINTEST {
public static void main(String[] args) {
Singleton singleton = Singleton.getInstance();
System.out.println("a=" + singleton.a);
System.out.println("b=" + singleton.b);
}
}




分析:

1.类的入口从main函数开始,当程序已启动,首先要调用第19行的代码,这个时候调用了类的静态方法(这时候,类开始初始化)

2.当类开始初始化的时候,所有的静态变量会被初始化成默认值。

3.以第一个图来说,当初始化完毕类的静态变量后,开始加载类,这个时候是按照顺序往下解析的。

4.当执行第二行的new Singleton的时候,会调用构造方法,这个时候,a和b都变成了1

5.当程序执行到第三行的时候,a还是1

6.当程序执行到第四行的时候,b变成了0

7.所以输出1和0


图二自己就可以理解了。



 

posted @ 2013-07-18 18:52  坚固66  阅读(309)  评论(0编辑  收藏  举报