Java中的最终用法和静态最终用法
这来自“Java思维”中“重新生成类”一章的Ex18。代码如下:Java中的最终用法和静态最终用法,java,final,Java,Final,这来自“Java思维”中“重新生成类”一章的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(
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,因为它被声明为最终静态字段。让我困惑的是,为什么“selfCounter”对象的id分别被指定为1和2,我有点困惑于如何基于另一个静态实例变量“count”计算id
感谢您的指导。ID是1和2,因为您正在创建三个SelfCounter对象,它们都共享相同的count字段,该字段隐式初始化为零 第一个是WithFinalFields中的静态自计数器。它的ID为零,因为count字段隐式初始化为零,并且count++的值为零
第二个ID是一,因为count++的值是一。第三个ID是2,因为count++的值是2。变量
私有静态int count
是一个静态变量,启动程序时它的值为0,并且不会重新创建<代码>私有int id=count++代码>是一个动态变量。创建
SelfCounter()
类的新实例时有3种情况:1是因为行static final SelfCounter scsf=new SelfCounter()代码>,第一次启动新建WithFinalFields()
时为1,第二次启动时为1。
因此,第一次和第二次启动WithFinalFields()
期间的值将分别为1和2。和静态字段在实例字段之前初始化?对。静态字段在类初始化期间初始化,必须在创建任何实例之前初始化。