解决方案 »

  1.   

         private static int x1 = printInit("static intx1 initialized");//父类静态
           private static int x2 = printInit("static beetle.x2 initialized");//子类静态
                System.out.println("beetle constructor");//接着才是
      

  2.   

    谁告诉你是先运行的Beetle b = new Beetle(); ?这里明显先运行的是静态的成员。
      

  3.   


    /**
     * 1> main方法要执行,需要先加载main方法所在的类的Class文件,
     *    也就是Beetle的Class,因为Beetle有父类Insect,所以现在加载Insect的Class文件
     * 2>静态成员变量和静态代码块的初始化和加载Class文件是同步进行的,
     *    所以加载Class文件的同时,完成静态代码块和静态成员变量的初始化工作
     * 3>Class文件加载完成之后,开始逐条语句执行 main方法
     * 4>在new 对象实例的时候,也会先执行当前类的父类的构造器
     * 5>类的实例化,会按顺序初始化 成员变量,最后执行构造函数
     * 
     * 综上:代码执行顺序如下
     * 1>private static int x1 = printInit("static intx1 initialized");
     * 2>private static int x2 = printInit("static beetle.x2 initialized");
     * 3>System.out.println("beetle constructor");
     * 4>Beetle b = new Beetle();
     * 5>private int i = 9;
     * 6>protected int j;
     * 7>public Insect() {
    System.out.println("i = " + i + ",j=" + j);
    j = 39;
    }
     * 8> private int k = printInit("beetle.k initialized");
     * 9>Beetle() {
    System.out.println("k=" + k);
    System.out.println("j = " + j);
    }
     * 
     */
      

  4.   

    先加载main方法的类,才能运行主程序.
      

  5.   

    原因为你的main方法是Beetle 的一个方法,所以会先加载该类的静态变量,如果你单独将这个main方法放到不是Beetle 或者其父类的类中,那么执行顺序就为
    beetle constructor
    static intx1 initialized
    static beetle.x2 initialized
    i = 9,j=0
    beetle.k initialized
    k=47