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

Order of accessing and Initializing Static Fields Java

考虑以下示例:

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 class 的 super() 构造函数,显然首先执行静态初始化器(如果有的话)然后在 Sub 中执行静态初始化器,然后此特定顺序的非静态初始化块和构造函数。

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

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