java - 为什么静态 block 不加载到被调用的对象中?

标签 java

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


SubClass将在第一次调用对象时加载。那么为什么 static init block 不执行呢? 谢谢。

最佳答案

因为在编译期间,SubClass.ID 会被编译器更改为 Super.ID。 就像 @Kugathasan Abimaran 所说,继承和静态是两个不同的东西。

示例:

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

关于java - 为什么静态 block 不加载到被调用的对象中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22191846/

相关文章:

java - HashMap Java 8 实现

java - Guava 基于策略的缓存

java - 为什么在 JPA 中需要分离实体?

java - 在 selenium webdriver 中,我可以点击保存按钮然后页面被保存但是它没有显示这样的元素错误消息无法继续

C 枚举的 Java 表示

java - 从请求 URL 中检索值

java - Alfresco 社区版中的扫描功能?

java - openCV中的模板匹配[JAVA]

java - 多个扫描按钮 Zxing

Java通过ftp上传文件零字节错误