Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/376.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中的最终用法和静态最终用法_Java_Final - Fatal编程技术网

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

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(

这来自“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(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。

和静态字段在实例字段之前初始化?对。静态字段在类初始化期间初始化,必须在创建任何实例之前初始化。