gpt4 book ai didi

java - 为什么静态 block 不能访问其后定义的静态变量

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:31:12 25 4
gpt4 key购买 nike

我检查过 Forward References During Field Initialization还有这个the answer from @assylias ,但我仍然没有得到原因的答案。

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

   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
}
}

是不是因为这个值还没有初始化,所以我们就明确禁止你使用它?或者有什么我不知道的与安全相关的东西?


已更新

这不是那个关于

的问题的重复

Why this doesn't happen when accessing with class name?

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

最佳答案

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

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

更新:

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

These restrictions are designed to catch, at compile time, circular or otherwise malformed initializations.

考虑一下:

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 规范不允许这样做。

关于java - 为什么静态 block 不能访问其后定义的静态变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55235056/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com