0

此代码如何正常工作并打印 9?

public class Dog{

    static {
        age=9;
    }

    static int age=7;

}

而且这段代码不能编译(非法前向引用)?请注意,我在静态块中更改了年龄。

public class Dog{

    static {
        age++;
    }

    static int age=7;

}

另一个问题是它们两者是如何工作的?根据我以前的 Java 知识,我知道一个规则:

在声明变量之前你不能访问它们

. 那么静态块如何知道实际的变量年龄是什么?

4

1 回答 1

2
public class Dog{

   static {
      age=9;
   }

   static int age=7;
}

静态块和静态变量初始化按照它们在源文件中出现的顺序执行。(java文档点9

接下来,按照文本顺序执行类的类变量初始化程序和静态初始化程序,或者接口的字段初始化程序,就好像它们是一个单独的块一样。

在上述情况下,您在声明某些情况下 java 允许的变量之前进行赋值。字段初始化期间的前向引用

用法在作业的左侧;

public class Dog {
   static {
      age++;
   }
   static int age=7;
}

在这种情况下,您在声明它是不允许的之前阅读它。这就是为什么你得到一个非法的前向引用异常。

j = 200; // 好的 - 赋值
j = j + 1; // 错误 - 右手边在声明之前读取

于 2020-05-12T09:47:09.087 回答