为什么静态块没有加载到被调用的对象中?


class Super { static String ID = "SUPER_ID"; }
class SubClass extends Super{
  static { System.out.print("In SubClass"); }
}
class Test{
  public static void main(String[] args) {
    System.out.println(SubClass.ID);
  }
}

为什么我在输出中

SUPER_ID

而不是

In SubClass
SUPER_ID


子类将在对象的第一次调用中加载。那么为什么static初始化块不执行呢?谢谢。

因为在编译时本身,编译器会将 SubClass.ID 更改为 Super.ID。就像@Kugathasan阿比马兰所说,继承和静态是两回事。

例:

public class SampleClass {
    public static void main(String[] args) {
        System.out.println(SubClass.ID);
        System.out.println(SubClass.i);
    }
}
class Super {
    static String ID = "SUPER_ID";
}
class SubClass extends Super {
    static {
        System.out.println("In SubClass");
    }
    static int i;
}
Output :
SUPER_ID
In SubClass // only when accessing a variable of subclass, the class will be initialized.
0

类加载器未加载您的类,因为它未在测试类中使用, 如果要加载它,只需在测试类中添加语句Class.forName("SubClass");,之后您就可以看到预期的结果。 您也可以使用类加载器而不是Class.forName加载此类。

class Test{
    public static void main(String[] args) {
    Class.forName("SubClass");
    //Thread.currentThread().getContextClassLoader().loadClass("SubClass");
    System.out.println(SubClass.ID);
    }
}

根据Java语言规范:

对静态字段的引用仅导致类或 实际声明它的接口,即使它可能通过 子类、子接口或实现接口的类的名称。

更多信息

最新更新