黑马程序员技术交流社区
标题:
java类初始化
[打印本页]
作者:
a944090777
时间:
2015-12-17 09:35
标题:
java类初始化
package com.bird.classLoad;
public class Test1 {
@SuppressWarnings("static-access")
public static void main(String[] args) {
Singleton s = Singleton.getSingleton();
System.out.println("counter1 = "+ s.counter1);
System.out.println("counter2 = "+s.counter2);
}
}
class Singleton{
private static Singleton singleton = new Singleton();
public static int counter1;
public static int counter2 = 0;
public Singleton(){
counter1++;
counter2++;
}
public static Singleton getSingleton(){
return singleton;
}
}
这段代码的答案是什么,为什么会这样呢?
作者:
胖小子
时间:
2015-12-17 10:22
好难啊。。。
作者:
李永佳
时间:
2015-12-17 12:17
我搜索了很久找了一篇差不多问题的文章:http://bbs.csdn.net/topics/380142566
我自己理解了一下,这是因为执行顺序的问题,private static Singleton singleton = new Singleton(); 这句话先执行,执行后counter2=1,然后public static int counter2 = 0; 执行后赋值为0。
其实可以在构造函数counter2++后面加上一句打印语句,会发现counter2确实是1。
然后我做了另一个修改: public static int counter2 = 5,结果counter2++; 执行之后的打印结果为1,整个程序运行的结果为5。
然后又做了一个修改:蒋public static int counter1; public static int counter2 = 0;这两句话放到 private static Singleton singleton = new Singleton();前面,结果截然不同。
所以结论就是,执行顺序引起的问题。
作者:
a591986427
时间:
2015-12-17 13:02
这个是java类初始化的问题,在类加载的时候初始化singleton,然后counter1然后counter2,已经被赋值的属性不会再被默认初始化,这个顺序就是类初始化的顺序
作者:
高云
时间:
2015-12-17 13:50
加油,,,
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2