求大家帮忙分析,要全面的!在线等
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步骤,所以得到你的结果。不知道我有没有介绍清楚。