1. 实验:利用IDE的debug功能给例6.4和例6.5的new语句设置断点,使用单步调试(step into/step over)跟踪子类对象实例化(初始化)的执行顺序,并总结该过程。
例6.4
class AddClass
{
public int x=0,y=0,z=0;
AddClass (int x)
{
this.x=x; }
AddClass (int x,int y)
{
this(x); this.y=y; } //调用第一个构造方法
AddClass (int x,int y,int z)
{
this(x,y); this.z=z; } //调用第二个构造方法
public int add()
{
return x+y+z; }
}
public class SonAddClass extends AddClass
{
int a=0,b=0,c=0;
SonAddClass (int x)
{
super(x); a=x+7; }
SonAddClass (int x,int y)
{
super(x,y); a=x+5; b=y+5; }
SonAddClass (int x,int y,int z)
{
super(x,y,z); a=x+4; b=y+4; c=z+4;}
public int add()
{
System.out.println("super:x+y+z="+super.add());
return a+b+c;
}
public static void main(String[] args)
{
SonAddClass p1=new SonAddClass (2,3,5);
SonAddClass p2=new SonAddClass (10,20);
SonAddClass p3=new SonAddClass (1);
System.out.println("a+b+c="+p1.add());
System.out.println("a+b="+p2.add());
System.out.println("a="+p3.add());
}
}
程序从main函数开始,执行“p1=new SonAddClass(2,3,5);”时,调用SonAddClass的含有三个参数的构造函数,然后首先调用父类AddClass的含有三个参数的构造函数,在父类的构造函数的执行过程中又套娃式的分别先调用含有两个参数和含有一个参数的重载的构造函数。
“SonAddClass p2=new SonAddClass(10,20);
SonAddClass p3=new SonAddClass(1);”
这两句的执行过程和上一句类似。
“System.out.println(“a+b+c=”+p1.Add());”
这一句在执行时先执行p1.Add(),再将“a+b+c=”输出。
运行结果:
例6.5:
class Pare
{
int i;
Pare(){
i=6;}
};
class Construct extends Pare
{
Construct(){
}
Construct(int num){
}
public static void main(String[] args){
Construct ct = new Construct(9);
System.out.println(ct.i);
}
}
程序从main函数开始,执行“Construct ct=new Construct(9);”时,首先调用Construct类的带参的