java - Java 静态字段的访问和初始化顺序

标签 java constructor static

考虑以下示例:

class Super{ 
   static String ID = "1234";
}
class Sub extends Super{
  static{ System.out.println("In Sub");
}

public static void main(String ...args){
  System.out.println(Sub.ID);
}

我的理解方式是:如果这是 main 中的 new Sub() ,它将调用 Super 类的 super() 构造函数,显然首先执行静态初始化程序(如果有),然后执行 Sub 中的静态初始化程序,然后是非静态 init block 和按此特定顺序构造函数。

话虽如此,这个程序打印了“1234”,如果 Sub 没有继承静态字段怎么办,这不应该是一个编译错误吗?

最佳答案

您可以通过该类型的子类型的表达式来访问该类型的(可访问的)静态成员。在编译时,它被解析为通过声明类型(本例中为 Super)的访问。

关于java - Java 静态字段的访问和初始化顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28550536/

相关文章:

基于 MVC 的应用程序上的 Java 控制反转

java - 升级 IntelliJ 后 Play Framework 中的 Controller 出现 InstantiationException

Python __init__ 与 C++ 构造函数相比

c++ - 在构造函数中声明变量

php - 后代中的静态变量赋值会冒泡到父级吗?

c++ - 如何强制 gcc 编译器/链接器从可执行文件中删除未使用的静态数组

javascript - 用于在 cypress 中选择复选框的自定义命令

java - Java Applet 中的文件权限错误

Javascript 对象构造函数未注册参数

java - 不能调用非静态方法