在声明变量说明之前声明静态初始化程序块

时间:2020-05-12 03:50:51

标签: java static-block variable-initialization

此代码如何正常工作并显示9?

public class Dog{

    static {
        age=9;
    }

    static int age=7;

}

此代码无法编译(非法前向引用)?请注意,我在静态区块中更改了年龄。

public class Dog{

    static {
        age++;
    }

    static int age=7;

}

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

在声明变量之前您不能访问变量

。那么静态区块如何知道 age 到底是什么变量?

1 个答案:

答案 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; //错误-右侧在声明前先读取