使用子类名访问父类静态字段不会加载子类?

K.T*_*ess 6 java inheritance static

class A {
    static int super_var = 1;
    static {
        System.out.println("super");
    }
}

class B extends A {
    static int sub_var = 2;
    static {
        System.out.println("sub");
    }    
}
public class Demo{
    public static void main(String []args){
        System.out.println(B.super_var);
    }
}
Run Code Online (Sandbox Code Playgroud)

产出是:

super
1
Run Code Online (Sandbox Code Playgroud)

这意味着子类不会加载或任何其他东西?它是如何工作的?

Roh*_*ain 12

当您static在子类引用上访问超类的字段时,只会加载和初始化声明该字段的类,在这种情况下它是A.这在JLS§12.4.1中指定- 发生初始化时:

static字段的引用(第8.3.1.1节)仅导致实际声明它的类或接口的初始化,即使它可能通过子类的名称,子接口或实现接口的类来引用.

强调我的.

因此,在您的代码中,类B甚至不会被初始化,因此它的static块将不会被执行.