此代码如何正常工作并显示9?
public class Dog{
static {
age=9;
}
static int age=7;
}
此代码无法编译(非法前向引用)?请注意,我在静态区块中更改了年龄。
public class Dog{
static {
age++;
}
static int age=7;
}
另一个问题是它们两者都如何工作?根据我以前的Java知识,我知道一条规则:
在声明变量之前您不能访问变量
。那么静态区块如何知道 age 到底是什么变量?
答案 0 :(得分:2)
public class Dog{
static {
age=9;
}
static int age=7;
}
静态块和静态变量初始化按照它们在源文件中出现的顺序执行。 (java documentation point 9
接下来,按照文本顺序执行类的类变量初始化器和静态初始化器,或者接口的字段初始化器,就像它们是单个块一样。
在上述情况下,在声明Java在某些情况下允许的变量之前,您正在执行赋值操作。 Forward References During Field Initialization
用法在作业的左侧;
public class Dog {
static {
age++;
}
static int age=7;
}
在这种情况下,您在声明不允许的内容之前先进行阅读。这就是为什么您会收到非法的前向引用例外。
j = 200; //好的-分配
j = j + 1; //错误-右侧在声明前先读取