即使使用子类型引用静态字段,也只初始化超类

时间:2013-04-30 16:28:43

标签: java static initialization

我正在研究JAVA初始化过程。 这是一个很好的参考资料: When a class is loaded and initialized in JVM

在此页面上有规则说: 3)如果由于访问静态字段而触发了类初始化,则只有已声明静态字段的Class才会被初始化,并且即使静态字段被子类的类型引用,它也不会触发超类或子类的初始化,Sub Interface或接口的实现类。

我真的不明白这个主意。如果静态字段由Sub类引用,则该字段当然需要创建子类对象或由Sub类对象分配。 因此,它肯定会触发Sub类初始化。

我的解释有什么问题?


修改

  1. 它会触发超类静态初始化。
  2. 如果静态字段是final,则在声明时初始化静态final字段。然后它既不会加载类也不会初始化类,因为这个静态final字段是编译时常量值。 注意:如果在静态块中初始化静态最终字段,则此语句不再保留。

3 个答案:

答案 0 :(得分:2)

我认为重点是在这样的情况下:

public class Superclass {
    public static long INIT_TIME = System.currentTimeMillis();

    static {
        System.out.println("Initializing Superclass");
    }
}

public class Subclass extends Superclass {
    static {
        System.out.println("Initializing Subclass");
    }
}

此代码:

long time = Subclass.INIT_TIME;

实际编译为:

long time = Superclass.INIT_TIME;
即使源代码引用Subclass,也会打印

“初始化超类”。

答案 1 :(得分:0)

一个例子:

class A {
   public static int nA = 0;
}

class B extends A {
   public static int nB = 1;
}

class C extends B {
   public static int nC = 2;
}

客户端:

int test = B.nA;

JVM将仅初始化A类。不是B也不是C.

答案 2 :(得分:0)

如上所示,当我运行Superclass / Subclass示例时,在调用Subclass.INIT_TIME时, 调用Superclass和Subclass静态初始值设定项。

但据说只会打印“初始化超类”。 有人可以澄清吗?