日期:2014-05-20  浏览次数:20791 次

求大家帮忙分析,要全面的!在线等
class SelfCounter { 
private static int count; //1 
private int id = count++; //2 
public String toString() { 
return "SelfCounter " + id;//3 }

class WithFinalFields { 
final SelfCounter scf = new SelfCounter(); //4 
static final SelfCounter scsf = new SelfCounter(); //5 
public String toString() { 
return "scf = " + scf + "\nscsf = " + scsf; //6 


public class a { 
public static void main(String args[]) { 
System.out.println("First object:"); 
System.out.println(new WithFinalFields()); 
System.out.println("Second object:"); 
System.out.println(new WithFinalFields()); }


结果:scf =SelfCounter 1
scsf =SelfCounter 0
scf =SelfCounter 2
scsf =SelfCounter 0

------解决方案--------------------
1:static final SelfCounter scsf = new SelfCounter(); //5
这一句是定义静态的常量,会优化执行,与JVM虚拟机执行顺序有关,并且他只执行一次(记住两次调用他只执行一次)。
2:private int id = count++;
初始化执行了到这一句的时候,count本身等于0,0的值交给了id,这时scsf的id值就等0,因为他只执行一次,所以不会再改变0的值了,这点很重要。
3:final SelfCounter scf = new SelfCounter(); //4 
虽然这句放在1之前,但JVM会后执行它,静态变量-》静态代码块-》main-》成员变量-》构造方法(简单说明一下)
所以执行这句的时候,由于count++执行过一次,现在的值已经为1,1赋给scf的id。count本身值为2。
4:new WithFinalFields(); 第二次执行时,1:不会再被执插,再次说明。
相当于执行了一次3步骤,所以得到你的结果。不知道我有没有介绍清楚。