解决方案 »

  1.   

    Java类和对象初始化顺序:
    1.加载父类,初始化其静态成员;
    2.加载类,初始化其静态成员;
    3.初始化父类实例成员,调用其构造方法;
    4.初始化类实例成员,调用其构造方法;按照上面的顺序:
    1.先初始化静态成员k = 0;t1 = new Test1("t1"); t2 = new Test1("t2");i = print("i"); int n = 99;,所以应该是先k=0,
    2.接着初始化t1,t1的初始化是调用构造方法,所以先初始化对象,而初始化对象就像上面的说明先初始化实例成员j和代码块print("构造块");,此时k=0;++k后k=1,i和n的初始值都为0,因此初始化j的时候打印"1:j   i=0   n=0",接着++i;++n;后i和n的值都为1,初始化代码块print("构造块")的时候打印"2:构造块   i=1   n=1";后面的静态成员和实例成员的初始化跟上面步骤1,2类似,自己推导一下就能得到结果;
      

  2.   

    这不就是阿里的题目吗?
    初始化的顺序是楼上说的,要注意的一点就是在初始化t1的时候,静态成员变量k,t2,i,n以及静态块在t中已经存在了,所以直接按顺序初始话成员变量和普通块,就是先输出j,然后构造块,然后就是初始化t2跟t1类似,然后初始化i,n,静态块,J,普通块,构造函数。
    plus:你在每一个语句设置一个断点,一步一步单步跟踪你就晓得执行顺序了
      

  3.   

    如上代码不变,main函数中新增加一个实例    public static void main(String[] args) {
         Test20140331 t = new Test20140331("init");
        
         Test20140331 t2 = new Test20140331("init2");
        }/**
     *  
     *  1 程序从main函数开始执行 ,执行main函数,需要先加载class文件
     * 2 加载class文件的同时,同时初始化static成员变量和static块,执行顺序为从上到下依次执行
     * 3 加载class完成之后,初始化成员变量。注:普通代码块,可以看作成员变量,执行顺序为从上到下依次执行
     * 4 上面的过程完成之后,再从main函数的第一条语句开始执行。
     * 5 注:静态成员变量和静态代码块只会 在加载class文件的时候 执行一次
     *//**
     * public static Test20140331 t1 = new Test20140331("t1");
     * 1>  1:j         i=0    n=0
     * 2>  2:构造块     i=1    n=1
     * 3>  3:t1        i=2    n=2
     * 
     * public static Test20140331 t2 = new Test20140331("t2");
     * 4>  4:j         i=3    n=3
     * 5>  5:构造块     i=4    n=4
     * 6>  6:t2        i=5    n=5
     * 
     * public static int i = print("i");
     * 7>  7:i         i=6    n=6
     * 
     * public static int n = 99;
     * 8>  n=99
     * 
     *     static {
            print("静态块");
        }
     * 9>   8:静态块    i=7    n=99
     * 
     * Test20140331 t = new Test20140331("init");
     * 10>  9:j         i=8    n=100
     * 11>  10:构造块     i=9    n=101
     * 12>  11:init      i=10    n=102
     * 
     *  * Test20140331 t = new Test20140331("init2");
     * 13>  12:j         i=11     n=103
     * 14>  13:构造块     i=12     n=104
     * 15>  14:init2      i=13    n=105
     * 
     */
      

  4.   

    //主函数贴错了,应该是下面的这个    public static void main(String[] args) {
            Test1 t = new Test1("init");
            Test1 t2 = new Test1("init2");
        }6楼分析了一下整个过程,如果有什么问题,还请各位指正,共同进步