java类加载顺序笔试题之出现new时如何思考(个人理解)

我对关键词的理解可能与你们的不同,所以如果有些名词的命名和你们的不一样请帮忙指出一下,非常感谢。

下面中有两个相同的new Singleton() 位置不一样结果也就完全不同了,因为执行的顺序是不同的。

 

PS:下面的代码非本人所写,是在csdn上看到的,但找不到原作者了,除了代码其余的都是自己的理解。

class  Singleton{
	private static Singleton singleton = new Singleton();  // 1
	public static int counter1;
	public static int counter2 = 0;
	private Singleton(){
		counter1++;//1
		counter2++;//1
	}
//	private static Singleton singleton = new Singleton();  // 2
	public static Singleton getInstance(){
		return singleton;
	}
}
 
public class Test{
	public static void main(String[] args) {
		Singleton singleton = Singleton.getInstance();
		System.out.println("counter1 = " + singleton.counter1);
		System.out.println("counter2 = " + singleton.counter2);
	}
}

假设第一个new Singleton() 存在,第二个new Singleton()被注释

步骤:

  1. 执行main()中的Singleton.getInstance()
  2. 找到Singleton类中的getInstance()里面的代码
  3. return singleton 有返回值,找到这个值,是一个静态变量(类变量)
  4. 找到这个值之后会发现是通过new Singleton()获得,再接着找Singleton()看里面的代码
  5. 后++并没有被使用所以counter1和counter2通过后++都变为了1
  6. new Singleton()执行完毕,结果为counter1=1 counter2=1 ,再按序执行代码
  7. public static int counter1;静态变量(类变量)默认值为0,但前面已经将counter1通过后++变成1 所以这里也为1
  8. public static int counter2 = 0; 前面原本通过后++变成了1但现在又进行了一次赋值,所以现在为0
  9. 现在Singleton.getInstance()里面的都执行完毕,再按序执行两个println();
  10. 结果为counter1=1 counter2=0

假设第二个new Singleton() 存在,第一个new Singleton()被注释

步骤:

  1. 执行main()中的Singleton.getInstance()
  2. 找到Singleton类中的getInstance()里面的代码
  3. return singleton 有返回值,找到这个值,是一个静态变量(类变量)
  4. 找到这个值之后会发现是通过new Singleton()获得,这个时候是重点了,我的理解是静态肯定是最先加载的,上面的new Singleton()也有static 所以是静态并且是在所有静态之前,是第一个,所以正常按序加载,不过需要将new Singleton()里面执行完毕后才执行下面的,而这里new Singleton()虽然也是静态但不是第一个所以先加载上面的静态。
  5. 执行最上面的两个静态变量 counter1虽然没有声明但默认为0,counter2=0 (静态变量int类型默认值为0 String默认值为null boolean默认值为false)
  6. 现在在使用new Singleton()里面的代码 counter1++  从默认值0变成1  counter2++ 从声明的0变成1
  7. 现在Singleton.getInstance()里面的都执行完毕,再按序执行两个println();
  8. 结果为counter1=1 counter2=1
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章