java - 为什么静态块不能访问它之后定义的静态变量
问题描述
我已经检查了字段初始化期间的前向引用,这是来自@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
}
}
是不是因为:这个值还没有初始化,所以我们只是明确地禁止你使用它?还是我不知道与安全有关的事情?
更新
这不是那个问题的重复
为什么使用类名访问时不会发生这种情况?
这个问题是关于为什么我们有这个设计?出于什么目的?
解决方案
静态字段根据它们在代码中出现的顺序进行初始化。
因此,当您为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 规范不允许这样做。
推荐阅读
- rust - 传递对此方法的引用并期望关闭的唯一选择是不安全的吗?
- python - 如何用更有效的代码替换“for”循环以进行股市分析示例
- kdb - 使用正则表达式获取子列表
- ajax - 如何使用数组调用控制器方法
- node.js - 可以使用 google-auth-library 进行一批请求吗?
- c# - c# win app forms检测图像上的人脸数量,如果超过1张人脸提示错误信息
- javascript - 用于在动态添加的行上禁用文本字段的复选框
- powershell - Power Apps PowerShell:找不到“UserCredential”和参数计数的重载:“2”
- maven - 控制每次执行时继承的 Maven 插件
- sql - 如何从不同格式的日期按月-年分组 (SQL)