1 先初始化父类的静态成员和静态块,然后初始化子类的静态成员和静态块,然后再初始化父类,然后再初始化子类。
2 先初始化父类
3 单个类初始化的顺序
先初始化成员变量和代码块,后调用构造函数
4 如果父类的构造函数中调用了被子类重写了的方法的话,在创建子类对象的时候,会调用子类中重写的方法
这个时候会出现的问题是,子类的成员还没有初始化,调用子类的方法返回的值并不是预想的结果。
至于为什么这样,是因为java编译器编译的时候,父类的构造函数调用被子类重写的方法时使用的是this指针,而不是super指针,this指针是指向子类对象的。
下面的例子会输出null
package com.gxlee;
public class Base {
private String baseName= "base";
public Base() {
callName();
}
public void callName(){
System.out.println(baseName);
}
static class Sub extends Base{
private String baseName = "sub";
public void callName(){
System.out.println(baseName);
}
}
public static void main(String[] args) {
Base b = new Sub();
System.out.println(b);
}
}