本示例分析了Debug过程,理解父类和派生类中的方法,什么时候分别被调用,构造方法按照什么顺序调用。
程序如下所示:
package cn.cqu;
public class TestClu{
public static void main(String[] args){
go(new MyBase());
}
static void go(Base base){
base.add(8);
}
}
class Base {
int i;
Base() {
add(1);
System.out.println(i + "---base");
}
public void add(int v){
i+=v;
System.out.println(i);
}
void print(){
System.out.println(i);
}
}
class MyBase extends Base{
MyBase() {
add(2);
System.out.println(i + "---mybase");
}
public void add(int v){
i+=v*2;
System.out.println(i);
}
}
进入Debug模式运行,执行的步骤为:
run --> 第5行 --> 28 --> 14 --> 15 --> 33 --> 34 --> 35 --> 16 --> 17 --> 29 --> 33 --> 34 --> 35
--> 30 --> 31 --> 5 --> 8 --> 33 --> 34 --> 35 --> 9 --> 6 --> end
程序运行结果为:
----------------------------------------------------------
2
2---base
6
6---mybase
22
----------------------------------------------------------
程序执行流程为:在主函数中首先执行(第5行) go(new MyBase()), 会首先调用父类的构造函数(第14行),在父类的函数Base中执行add()方法,注意:这里的add()方法由于是MyBase对象调用的,将会首先查找MyBase中是否有该方法,所以Base()构造方法中的add()实际上是调用的MyBase类中的add()方法(32行)。
执行完add()之后,i的值为2,父类构造方法执行完毕;接下类执行派生类的构造方法,即MyBase(),这里的add(2)当然也是派生类的,i的值就变成了6,最后执行go方法里面的add(8),调用的是派生类中的add()方法,最终i的值为22.