/**
* Created by lightman_mac on 2018/9/4.
* <p>
* 奇葩情况: 在父类构造器里调用子类的方法
*
* 遇到 WuhuaBase b = new WuhuaChild()的时候,
* 因为要初始化WuhuaChild肯定得先初始化它的各种父类,
* 然后代码就跳转到了父类构造方法
*
* 在父类构造方法里有一个callName()方法
* 这里的callName()方法到底是父类的呢还是子类的呢?
* 总之在父类构造方法里输入 this 是子类对象
* 所以这里调用的是子类的callName方法.
*
* 调用子类的callName方法时baseName还没有被赋值,所以输出是null
*
* 但是接下来还是会接着调用子类的构造方法 然后对子类的baseName进行初始化赋值
*
* 注意这里比较奇葩 先调用的子类的某个方法 然后才执行子类的构造方法
*
* 静态方法块随类加载执行
* 非静态方法块优先于类实例化前先初始化
*
* 总结 :
* 父类静态方法块-》子类静态方法块-》父类非静态方法块-》父类成员变量-》父类构造函数执行
* -》子类非静态方法块-》子类成员变量-子类构造函数实例化
*
*
*
*/
public class WuhuaBase {
private String baseName = "base";
static {
System.out.println("static parent method");
}
{
System.out.println("not static parent method……");
}
public WuhuaBase() {
System.out.println("WuhuaBase constructor this = " + this);
callName();
}
public static void main(String[] args) {
WuhuaBase b = new WuhuaChild();
}
public void callName() {
System.out.println("callName in WuhuaBase -> " + baseName);
}
static class WuhuaChild extends WuhuaBase {
private String baseName = "sub";
static {
System.out.println("static child method");
}
{
System.out.println("not static child method……");
}
public WuhuaChild() {
System.out.println("now invoke WuhuaChild constructor");
}
public void callName() {
System.out.println("callName in Child -> " + baseName);
}
}
}
java父子类实例化时对应的 成员变量、方法块、静态方法块初始化顺序小结
最新推荐文章于 2022-09-28 09:26:49 发布