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

    xiaoxiao2026-04-08  4

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

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

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

    转载请注明原文地址: https://ju.6miu.com/read-1308639.html
    最新回复(0)