黑马程序员技术交流社区

标题: 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