先看一个这么的程序:
//------------------------------------------------------------------------//
//程序目的,创建一个父类与子类,分别创建构造方法
public abstract class usecase1 {abstract void testAbstract();usecase1(){//(1)首先执行父类构造方法System.out.println("before testAbstract()");testAbstract();//如果调用了抽象方法,调用子类覆盖的方法。这里调用Atest类的testAbstract()方法System.out.println("after testAbstarcat()");}public static void main(String args[]){new Atest();}
}
class Atest extends usecase1{//这里先把父类给继承了private int i=1;//(2)使成员变量进行初始化void testAbstract(){//这里说明一下就开始定义了System.out.println("1111111111testAbstract()"+i);//这里给覆盖了一下}public Atest(){//(3)调用子类构造方法System.out.println(i);}
}
//很容易的可以发现,当创建子类对象的时候
//①先调用了子类的构造函数
//②调用了父类的构造函数
//③执行了父类的构造函数
//④执行了子类的构造函数
该程序的运行结果如下:
你猜对运行结果没有?
这里主要涉及到了一个构建子类对象时顺序的问题
调用顺序如下:
//①先调用了子类的构造函数
//②调用了父类的构造函数
//③执行了父类的构造函数
//④执行了子类的构造函数