理解关于java类的加载顺序
首先来捋一捋java类的加载顺序吧
- 父类静态代码块 》》静态代码初始化,静态属性(带有static),不包括静态方法
- 子类的静态代码 》》静态代码初始化,静态属性(带有static),不包括静态方法
- 父类非静态代码块 》非静态代码块,非静态属性(无static)
- 父类构造函数
- 子类非静态方法 》非静态代码块,非静态属性(无static)
- 子类构造函数
上代码
public class test3 {
private String baseName = "base";
public test3(){
System. out. println("执行父类的test3()");
callName();
}
public void callName(){
System. out. println("执行父类的callName()");
System. out. println(baseName);
}
//内部类继承
static class Sub extends test3
{
private String baseName = "sub";
@Override
public void callName(){
System. out. println("执行子类的callName()");
System. out. println(baseName);
}
}
public static void main(String[] args)
{
test3 b = new Sub();
}
}
运行结果

代码执行流程
1. main方法执行test3 b=new Sub(),会执行父类的构造函数test3();
2. test3()里有方法callName(),会优先到子类里查询又没有这个方法,如果没有则会执行父类的callName()方法。
3. 由于子类有这个方法,所以执行子类的callName()方法,由于当前只执行到父类的构造函数,子类的非静态属性baseName还未加载,所以会返回null;
加一点料
如果再main方法里加个调用方法
public static void main(String[] args)
{
test3 b = new Sub();
b.callName();
}
结果

可以看到,此时会输出子类的baseName属性,因为此时子类的非静态属性已经通过调用反法加载了
以上纯属个人理解,如有错误,请大佬指出;
网友评论