首页 > 解决方案 > 为什么静态块不能访问它之后定义的静态变量

问题描述

我已经检查了字段初始化期间的前向引用,这是来自@assylias 的答案,但我仍然没有回答为什么

为什么静态块可以分配在它之后声明的静态变量但不能访问它?

   class Parent {
        static {
            i = 2; // valid
            // can only assign new value to it instead of accessing it?
//            System.out.println(i); // invalid - compile-error
        }
        static int i = 0;
        static {
            i = 3; // valid
        }
    }

是不是因为:这个值还没有初始化,所以我们只是明确地禁止你使用它?还是我不知道与安全有关的事情?


更新

这不是那个问题的重复

为什么使用类名访问时不会发生这种情况?

这个问题是关于为什么我们有这个设计?出于什么目的?

标签: javajava-8staticstatic-block

解决方案


静态字段根据它们在代码中出现的顺序进行初始化。

因此,当您为i变量赋值时,您只需对编译器说:“嘿,伙计,当您开始初始化此变量时,请将其值设置为...”。但是在它初始化之前你不能使用它,因为它根本不存在。

更新:

正如 James Gosling、Bill Joy、Guy Steele 和 Gilad Bracha 在《Java 语言规范》一书中所说:

这些限制旨在在编译时捕获循环或其他格式错误的初始化。

考虑一下:

static {
            i = 2;
            j = i + 5; //should it be 7 or 15?
}
static int i = 10;
static int j;

j变量应该是 7 还是 15?如果它是 7,那么我们已经初始化i了两次变量,这是不可能的,因为该字段是静态的。如果是15,那是什么i = 2;意思?

此代码不明确,因此 Java 规范不允许这样做。


推荐阅读