Java中的最终和静态最终用法

时间:2013-05-22 02:17:08

标签: java final

这是来自“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的计算。

感谢您的指导。

2 个答案:

答案 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。