首先先做一个测试:
1.创建父类:
public abstract class BaseTest {
public BaseTest() {
initData();
}
public abstract void initData();
}
2.创建子类:
public class Test extends BaseTest {
private int a = 3;
@Override
public void initData() {
a= 5;
}
public int getA(){
return a;
}
}
3.实例化并取值:
Test test = new Test();
int a = test.getA();
Log.i("Test", a +"");// 此时a的值是3。
原因:
1.首先加载父类,初始化父类的静态成员变量和静态代码块
2.初始化子类静态方法和静态代码块
3.执行子类构造方法的super方法,super会实例化父类对象即初始化父类里面的成员变量,构造代码块,然后是父类构造方法
4.实例化子类即初始化子类的成员变量,构造代码块,最后执行子类的构造方法
综上,当实例化Test的时候会先执行BaseTest 的构造方法,BaseTest的构造方法会调用intiData,此时会给a赋值为5。之后执行Test的成员变量的初始化,所以a的值被赋值为了3.