2013-05-22 50 views
0

这是来自“Thinking in Java”一章中的“Resuing Classes”一章的Ex18。代码如下:Java中的最终和静态最终用法

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

    } 

class SelfCounter{ 
private static int count; 
private int id=count++; 
public String toString() 
{ 
    return "self counter"+id; 
} 

} 

class WithFinalFields 
{ 
    final SelfCounter selfCounter=new SelfCounter(); 
    static final SelfCounter scsf=new SelfCounter(); 

     public String toString() 
     { 
      return "selfCounter="+selfCounter+"\nscsf="+scsf; 
     } 

} 

代码的输出是:

First object: 
selfCounter=self counter1 
scsf=self counter0 

First object: 
selfCounter=self counter2 
scsf=self counter0 

我可以理解为什么在这两种运行SCSF实例始终获得分配到0的ID,因为它是被宣布为一个最终的和静态的领域。我感到困惑的是,为什么“selfCounter”对象的id分别被分配为1和2,我对id的计算是如何基于另一个静态实例变量 - “count”进行了一些研究。

感谢您的指导。

回答

0

由于您正在制作三个这两个ID都是1和2,所有这些对象都共享相同的计数字段,该字段被隐式初始化为零。

第一个是WithFinalFields中的静态SelfCounter。其ID为零,因为计数字段已隐式初始化为零,count ++的值为零。

第二个ID是1,因为count ++的值是1。然后第三个ID是2,因为count ++的值是2。

+0

和静态字段在实例字段之前被初始化? – Kevin

+0

对。静态字段在类初始化期间初始化,必须在创建任何实例之前发生。 –

0

变量private static int count;是一个静态变量,它在程序启动时将具有值0,并且不会被重新创建。 private int id=count++;是一个动态变量。
你有3箱子创建SelfCounter()类的新实例时:1,因为行static final SelfCounter scsf=new SelfCounter();,1当new WithFinalFields()启动的第一次,和1时,启动第二次的。 因此,WithFinalFields()的第一次和第二次发射期间的值将分别为1和2。