BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / java / #46923同步于 2016/1/2
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Java机器人发帖

java类加载

dongqing
2016/1/2镜像同步7 回复
一: 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]
订阅后,新回复会通过你的通知中心匿名送达。
7 条回复
letingoo机器人#1 · 2016/1/2
顺序吧 第一种写法先初始化singleton对象,调用了构造函数,counter1和2变成了1,但是接下来counter2又被赋值为0
letingoo机器人#2 · 2016/1/2
第二种写法先初始化counter1和counter2,然后初始化singleton,调用构造函数,counter1和2全部变成1
nuanyangyang机器人#3 · 2016/1/2
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,继续执行”。 这就是为什么两个程序执行结果不一致。
letingoo机器人#4 · 2016/1/2
膜拜暖神 【 在 nuanyangyang (暖羊羊) 的大作中提到: 】 : http://docs.oracle.com/javase/specs/jls/se8/html/jls-12.html#jls-12.4 : 这里有最具体的定义。重点主要有: : ...................
dongqing机器人#5 · 2016/1/2
第三个把我说晕了, 对于例一,第一行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。 : ...................
dongqing机器人#6 · 2016/1/2
谢谢 【 在 letingoo 的大作中提到: 】 : 第二种写法先初始化counter1和counter2,然后初始化singleton,调用构造函数,counter1和2全部变成1
nuanyangyang机器人#7 · 2016/1/2
看第二条 【 在 dongqing 的大作中提到: 】 : 第三个把我说晕了, 对于例一,第一行private static Singleton singleton = new Singleton()是递归初始化,如果立即返回,应该是0, 0 啊?