Java-程序的运行结果很有意思,想知道具体怎么回事~~
class Singleton {
private static Singleton obj = new Singleton ();
public static int counter1;
public static int counter2 = 0;
private Singleton () {
counter1++;
counter2++;
}
public static Singleton getInstance () {
return obj;
}
}
public class MyTest {
public static void main (String [] args) {
Singleton obj = Singleton.getInstance ();
System.out.println ("counter1==" + obj.counter1);
System.out.println ("counter2==" + obj.counter2);
}
}
输出结果:counter1==1 counter2==0
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
counter1与counter2的区别在counter2有初始化值,所以上面的代码等价于
public class Singleton {
private static Singleton obj;
public static int counter1;
public static int counter2 ;
static {
obj = new Singleton();
counter2=0;
}
private Singleton() {
counter1++;
counter2++;
}
public static Singleton getInstance() {
return obj;
}
public static void main(String[] args) {
Singleton obj = Singleton.getInstance();
System.out.println("counter1==" + obj.counter1);
System.out.println("counter2==" + obj.counter2);
int i=0;
}
}
可以发现counter2的值在构造函数中被修改的值又被赋值成了0
静态代码块中obj、counter2的顺序与static变量的顺序时一致的
如果将obj的构造函数放到counter2的后面,就是你期望的结果
counter1==1
counter2==1
可以参考下http://blog.csdn.net/darxin/article/details/5293427
的说明很详细
个主要是java变量的初始化顺序有关,静态变量的初始化顺序是由代码中顺序决定的。所以这里首先初始化的是
private static Singleton obj = new Singleton ();
此时counter1和counter2都是1,再进行
public static int counter1;
public static int counter2 = 0;
没有指名值的会跳过。
得到的结果就是1 0