Java-程序的运行结果很有意思,想知道具体怎么回事~~

发布于 2016-12-18 03:04:09 字数 661 浏览 1163 评论 2

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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

瑾兮 2017-06-20 03:03:49

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
的说明很详细

虐人心 2017-05-04 04:26:58

个主要是java变量的初始化顺序有关,静态变量的初始化顺序是由代码中顺序决定的。所以这里首先初始化的是
private static Singleton obj = new Singleton ();
此时counter1和counter2都是1,再进行
public static int counter1;
public static int counter2 = 0;

没有指名值的会跳过。
得到的结果就是1 0

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文