这是来自“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的计算。
感谢您的指导。
答案 0 :(得分:0)
ids是1和2,因为您正在制作三个 SelfCounter对象,所有这些对象共享相同的计数字段,该字段被隐式初始化为零。
第一个是WithFinalFields中的静态SelfCounter。它的ID为零,因为count字段被隐式初始化为零,而count ++的值为零。
第二个ID是1,因为count ++的值是1。然后第三个ID是两个,因为count ++的值是两个。
答案 1 :(得分:0)
变量private static int count;
是一个静态变量,当程序启动时它将具有值0,并且不会重新创建。 private int id=count++;
是一个动态变量
创建SelfCounter()
类的新实例时有3种情况:由于行static final SelfCounter scsf=new SelfCounter();
为1,在第一次启动new WithFinalFields()
时为1,而在第一次启动时为1第二次推出。
因此,WithFinalFields()
第一次和第二次启动期间的值将分别为1和2。