这是来自“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”进行了一些研究。
感谢您的指导。
和静态字段在实例字段之前被初始化? – Kevin
对。静态字段在类初始化期间初始化,必须在创建任何实例之前发生。 –