类初始化及加载学习(一)

来源:互联网 发布:中国汽车内饰网数据 编辑:程序博客网 时间:2024/05/06 20:01

今天看了《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. 构造函数执行完毕后,返回主函数,对象创建完毕。

书中的这段代码,感觉很经典,同时,有其他想法也可以继续在这之上修改调试。

仅根据自己的学习体会写出来而已,或许很浅显,但对我来说值得学习,轻喷。


0 0
原创粉丝点击