返回信息流一:
class Singleton{
private static Singleton singleton = new Singleton();
public static int counter1;
public static int counter2=0;
private Singleton(){
counter1++;
counter2++;
}
public static Singleton getInstance(){
return singleton;
}
}
public class MyTest {
public static void main(String[] args) {
Singleton singleton = Singleton.getInstance();
System.out.println("counter1: "+singleton.counter1);
System.out.println("counter2: "+singleton.counter2);
}
}
输出结果是:
counter1: 1
counter2: 0
二:将一稍作修改
class Singleton{
public static int counter1;
public static int counter2=0;
private static Singleton singleton = new Singleton();
private Singleton(){
counter1++;
counter2++;
}
public static Singleton getInstance(){
return singleton;
}
}
public class MyTest {
public static void main(String[] args) {
Singleton singleton = Singleton.getInstance();
System.out.println("counter1: "+singleton.counter1);
System.out.println("counter2: "+singleton.counter2);
}
}
输出结果:
counter1: 1
counter2: 1
这两种结果为什么不一样?自己理不清,大神们讲一讲这两个具体是怎么运行的?
[ema23][ema23]
这是一条镜像帖。来源:北邮人论坛 / java / #46923同步于 2016/1/2
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Java机器人发帖
java类加载
dongqing
2016/1/2镜像同步7 回复
订阅后,新回复会通过你的通知中心匿名送达。
7 条回复
http://docs.oracle.com/javase/specs/jls/se8/html/jls-12.html#jls-12.4
这里有最具体的定义。重点主要有:
一、类的初始化在以下4种情况的任何一个之前发生:(1)创建这个类的实例;(2)调用这个类的静态方法;(3)它的一个非final成员变量被使用或者赋值;(4)里面有assert被执行。这个例子里是属于要调用静态方法getInstance。
二、类里面的成员变量,按照代码的顺序初始化。这个例子里,例1按singleton,counter1,counter2的顺序初始化,例2按counter1,counter2,singleton的顺序。
三、当初始化还未完成,又需要初始化的时候,(即Singleton还没有初始化完成,又要因为给singleton变量赋值而new Singleton),这时候,Java会发现Skeleton的初始化正在进行中,一定发生了递归的初始化。这时候会拒绝递归初始化,而立即“正常返回”,也就是“singleton=new Singleton()的时候,当成Singleton已经初始化完了,不递归地初始化Sinngleton,继续执行”。
这就是为什么两个程序执行结果不一致。
膜拜暖神
【 在 nuanyangyang (暖羊羊) 的大作中提到: 】
: http://docs.oracle.com/javase/specs/jls/se8/html/jls-12.html#jls-12.4
: 这里有最具体的定义。重点主要有:
: ...................
第三个把我说晕了, 对于例一,第一行private static Singleton singleton = new Singleton()是递归初始化,如果立即返回,应该是0, 0 啊?
【 在 nuanyangyang 的大作中提到: 】
: http://docs.oracle.com/javase/specs/jls/se8/html/jls-12.html#jls-12.4
: 这里有最具体的定义。重点主要有:
: 一、类的初始化在以下4种情况的任何一个之前发生:(1)创建这个类的实例;(2)调用这个类的静态方法;(3)它的一个非final成员变量被使用或者赋值;(4)里面有assert被执行。这个例子里是属于要调用静态方法getInstance。
: ...................
谢谢
【 在 letingoo 的大作中提到: 】
: 第二种写法先初始化counter1和counter2,然后初始化singleton,调用构造函数,counter1和2全部变成1
看第二条
【 在 dongqing 的大作中提到: 】
: 第三个把我说晕了, 对于例一,第一行private static Singleton singleton = new Singleton()是递归初始化,如果立即返回,应该是0, 0 啊?