在上一节中我们阐述了?一个类被初始化的过程_super码王的博客-CSDN博客
一个类被初始化的过程_super码王的博客-CSDN博客https://blog.csdn.net/qq_41885673/article/details/123826227?spm=1001.2014.3001.5502下面我们来组合一下,当存在父子类的时候,他的类加载机制又是怎样的呢?
代码设计
父类
package com.wust.yq;
public class ParentClass {
//静态变量
public static String p_StaticField = "父类--静态变量";
//变量
public String p_Field = "父类--变量";
protected int i = 0;
protected int j = 0;
//静态初始化块
static {
System.out.println(p_StaticField);
System.out.println("父类--静态初始化块");
}
//构造器
public ParentClass() {
System.out.println("父类--构造器");
System.out.println("i=" + i + ", j=" + j);
i = 1;
j = 1;
}
}
子类
package com.wust.yq;
public class ChildClass extends ParentClass {
//静态变量
public static String s_StaticField = "子类--静态变量";
//变量
public String s_Field = "子类--变量";
//静态初始化块
static {
System.out.println(s_StaticField);
System.out.println("子类--静态初始化块");
}
//初始化块
{
System.out.println(s_Field);
System.out.println("子类--初始化块");
}
public ChildClass(){
System.out.println("子类--构造器");
System.out.println("i=" + i + ", j=" + j);
}
public static void main(String[] args) {
new ChildClass();
// new ParentClass();
}
}
运行结果展示
- 当只是加载子类时调用顺序(注释掉下面两行代码即可)
也就是说和我们上节课讲道德 类加载的时候只涉及静态属性的初始化,完全符合,对于父子类这种情形,父类先完成类的加载,子类后完成。
同样,这个也是符合我们的预期的,即完成了父子类的静态代码块初始化之后再初始化实例类型,只不过都是先父类再子类
同样,这个也是符合我们的预期的,即完成了父子类的静态代码块初始化之后再初始化实例类型,只不过这里只实例化了父类
|