今天看了《Thinking In Java》的一点内容,感觉只看书依然有些模糊,于是,动手实际Debug了下,一步一步看程序如何运行的,并准备记录下来。先将代码贴上:
/**
* @author Herb 2016/8/16
*/
class Insect{
private int i = 9;
protected int j;
Insect(){
System.out.println("i = "+ i +",j = "+j);
}
private static int x1 = printInit("static Insect.x1 initialized");
static int printInit(String s){
System.out.println(s);
return 47;
}
}
public class Beetle extends Insect{
private int k =printInit("Beetle.k initialized");
public Beetle(){
System.out.println("k = " + k);
System.out.println("j = " + j);
}
private static int x2 = printInit("static Beetle.x2 initialized");
public static void main(String[] args){
System.out.println("Beetle Constructor");
Beetle b = new Beetle();
}
}
以上为书中代码,并无改动。下面介绍运行情况。
首先在带有所有的static关键字的语句前打断点,再在构造函数前加断点,然后开始调试:
1. 程序启动之后直接进入基类Insect的静态函数之中:其实是先进入了静态变量,因为初始化时调用静态函数,故停在了printinit(String s)之中,继续下一步执行
2. 静态函数执行完输出static Insect.x1 initialized ,然后将x1置为47,go on
3. 程序跳到了Beetle类中的静态变量x2的初始化,同上一步相同,再执行静态函数printinit(String s),输出 static Beetle.x2 initialized
,然后将x2赋值为47 ,继续
4. 此时类加载完成,开始了主函数main()的执行,执行main()函数的第一条输出语句,输出Beetle Constructor, 继续
5. 创建Beetle对象,首先调用基类Insect的构造函数,注意:虽然转到构造函数的入口,但并没有立即进入执行,而是先跳到外部执行其成员变量的初始化,这点值得注意。然后再执行构造方法内部语句,输出
6. 父类构造方法执行完毕后,执行Beetle的构造方法,同样是先执行成员变量的初始化,由于其成员变量的初始化需要printinit(String s) ,故又一次调用该函数,完毕后返回47给k ,接着执行构造函数中的输出语句
7. 构造函数执行完毕后,返回主函数,对象创建完毕。
书中的这段代码,感觉很经典,同时,有其他想法也可以继续在这之上修改调试。
仅根据自己的学习体会写出来而已,或许很浅显,但对我来说值得学习,轻喷。