0

这是来自“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 的计算有点卡住了。

感谢您的指导。

4

2 回答 2

0

该变量private static int count;是一个静态变量,程序启动时它的值为0,不会重新创建。private int id=count++;是一个动态变量。
创建类的新实例时有 3 种情况SelfCounter():1 是因为 line static final SelfCounter scsf=new SelfCounter();,1new WithFinalFields()是第一次启动,1 是第二次启动。因此,第一次和第二次启动期间的值WithFinalFields()将分别为 1 和 2。

于 2013-05-22T02:28:54.237 回答
0

id 是 1 和 2,因为您正在创建三个SelfCounter 对象,所有这些对象都共享相同的计数字段,该字段被隐式初始化为零。

第一个是 WithFinalFields 中的静态 SelfCounter。它的 ID 为零,因为 count 字段被隐式初始化为零,并且 count++ 的值为零。

第二个 ID 为 1,因为 count++ 的值为 1。然后第三个 ID 是 2,因为 count++ 的值是 2。

于 2013-05-22T02:26:46.660 回答