访问和初始化静态字段的顺序 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
。
考虑以下示例:
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
。