这是来自“Thinking in Java”中“Resuing Classes”一章的Ex18。代码如下:
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 实例总是将 id 分配给 0,因为它被声明为 final 和 static 字段。让我感到困惑的是为什么“selfCounter”对象的 id 分别被分配为 1 和 2,我对如何基于另一个静态实例变量 -“count”进行 id 的计算有点卡住了。
感谢您的指导。