A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© a944090777 中级黑马   /  2015-12-17 09:35  /  621 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

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;  
    }  
      
}
这段代码的答案是什么,为什么会这样呢?

4 个回复

倒序浏览
好难啊。。。
回复 使用道具 举报
我搜索了很久找了一篇差不多问题的文章: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();前面,结果截然不同。

所以结论就是,执行顺序引起的问题。
回复 使用道具 举报
这个是java类初始化的问题,在类加载的时候初始化singleton,然后counter1然后counter2,已经被赋值的属性不会再被默认初始化,这个顺序就是类初始化的顺序
回复 使用道具 举报
加油,,,
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马