详解Java中继承关系类加载顺序问题
介绍
当一个Java类继承另一个Java类时,这两个类的加载顺序会有所不同。这篇攻略将帮助你完全了解这个问题,以及解决相关的问题。
加载顺序
当一个Java程序启动时,JVM会按以下顺序加载类:
- 加载超类
- 解析超类中的静态字段和静态块
- 加载子类
- 解析子类中的静态字段和静态块
- 执行超类构造函数
- 执行子类构造函数
示例
示例1
考虑以下代码:
public class SuperClass {
static {
System.out.println("SuperClass init!");
}
public static int value = 123;
}
public class SubClass extends SuperClass {
static {
System.out.println("SubClass init!");
}
}
在运行main方法时,输出的结果为:
SuperClass init!
123
从输出可以看出,在首次使用SubClass
之前,会先加载并初始化其父类SuperClass
。在子类中没有静态字段和静态块的情况下,只需要加载父类。
示例2
考虑以下代码:
public class SuperClass {
static {
System.out.println("SuperClass init!");
}
public static int value = 123;
}
public class SubClass extends SuperClass {
static {
System.out.println("SubClass init!");
}
static int value = 456;
}
在运行main方法时,输出的结果为:
SuperClass init!
SubClass init!
123
这里较第一个示例中增加了子类中的静态字段,它会在类初始化时被赋值。从输出中可以看出,在首次使用SubClass
之前,会先加载并初始化其父类SuperClass
。在加载子类时,也会初始化子类中的静态字段和静态块,因此输出中会先显示SubClass init!
。如果子类中有与父类相同的静态字段,那么子类中的值将覆盖父类中的值。
结论
当子类继承父类时,JVM将遵循一定的加载顺序,确保父类始终能够先加载和初始化。如果子类中没有静态字段和静态块,就只需要加载父类。如果有静态字段和静态块,那么子类中的这些成员会在类初始化时被初始化。在加载父类和子类时,会依次执行类的静态块。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解java中继承关系类加载顺序问题 - Python技术站