执行顺序:(优先级从高到低。)静态代码块>mian方法>构造代码块>构造方法。
其中静态代码块只执行一次。构造代码块在每次创建对象是都会执行。
1 类加载从上往下执行,依次执行静态的初始化语句和初始化块,且类加载优先于对象创建。(静态初始化语句和静态初始化块只加载一次)
2 创建本类的对象时:从上往下执行一次非静态的初始化语向和初始化块,最后执行构造函数。
3 创建另一个类对象时:先加载另一个类的静态语句和静态初始化块(同样也只是第一次才会加载他的静态语句和初始化块,同样也只加载一次)。然后再加载其他类的非静态的初始化语向和初始化块,最后执行构造函数。
4 静态语句初始化时可以创建类对象。
5 静态方法可以只加载而不调用,不调用不执行。
先上阿里面试题:
运行结果:
首先,类加载顺序为从上往下执行,最先执行静态的初始化语句和初始化块(静态语句也是从上往下一行行执行),且所有的静态的初始化语句和初始化块只执行一次(总结中第1条)
下面类开始加载:
先给k赋初始值1,然后创建本类对象t1,由于在创建本类的对象时:从上往下执行一次所有的非静态的初始化语向和初始化块,最后执行该对象对应的构造函数。(总结中第2条)。
所以先执行代码中存在的非静态初始化块,这时候会调用块内的print函数,即输出 1:初始化块 i=0 n=0 (这里i和n都是默认值0是因为还没有对其进行初始化操作) 接着给j赋初始值100,由于最后执行构造函数且当前static语句还没有执行完(即11行代码),所以就该执行第30行代码了,及调用print函数,也就输出 2:j i=1 n=1,由于该11行static语句还没有执行完,所以main方法也不执行。到此第11行代码执行完毕。
接着就该第12行代码,也就是创建本类对象t2,和上面创建本类对象t1的步骤一致,也就把运行结果中的4 到6输出出来了。
接着执行第13行代码,也就会调用print函数,即输出7:i i=6 n=6。
接着执行第14行代码,也就是给n赋初始值99。
接着执行第26行静态块,也就会调用print函数,即输出8:静态块 i=7 n=99(因为此时n已被赋初始值99),然后n被赋值为100。这个静态块也就执行完了。
接着就是执行下一个静态,也就是到第37行main方法了,main方法里又是创建一个本类对象,那步骤就和上面创建t1和t2的一样了。首先执行一遍非静态初始化块,调用print函数,即输出9:初始化块 i=8 n=100,由于方法内执行了++n操作,此时n的值为101了。
接着执行第30行代码,也就是调用print函数,也就输出了 10:j i=9 n=101,++n后,n的值变为102.
最后就只剩下执行构造函数了,也就是输出 11:test i=10 n=102
然后执行++n和++i操作后,i=11,n=103。
到此最后的main方法也已经执行完毕,完结撒花!!!