前提知识:
总结:
JVM加载类的执行顺序 先父后子 类变量(static成员变量)-->静态代码块-->main函数 将构造函数加载栈中- ->加载成员变量/代码块--调用构造函数并返回
public class ParentMainTest {
static int x; static { x++; System.out.println("ParentMainTest_static_x:" + x); } public static void main(String[] args) { new SonMainTest(8); } int n = 10; { n++; System.out.println("ParentMainTest_nostatic_n:" + n); }}public class SonMainTest extends ParentMainTest{
SonMainTest(int a){ this.a=a; System.out.println("SonMainTest.a=" + a ); } int a; { System.out.println("SonMainTest_nostatic_a:"+this.a); } static{ x++; System.out.println("SonMainTest_static..." +x); }}输出结果:ParentMainTest_static_x:1SonMainTest_static...2ParentMainTest_nostatic_n:11SonMainTest_nostatic_a:0SonMainTest.a=8JVM加载类的执行顺序 先父后子 类变量(static成员变量)-->静态代码块-->main函数 将构造函数加载栈中- ->加载成员变量/代码块--调用构造函数并返回//step0 JVM装载对应的.class字节码文件public class ParentMainTest { static int x; //step1:初始化类变量 x默认值int类型为0,Integer为null static { //step2:初始化静态代码块 x++;//step2.1 x自增 x值为1 System.out.println("ParentMainTest_static_x:" + x);//step2.2 输出ParentMainTest_static...1 } public static void main(String[] args) { //step3:执行main函数 new SonMainTest(8);//step4:将SonMainTest.class加载的jvm,通过构造函数初始化SonMainTest对象 } int n = 10; //step10: 构造函数加载实例成员变量 { //step11: 构造函数加载实例成员代码块 n++; //step11.1 n=11; System.out.println("ParentMainTest_nostatic_n:" + n); step11.2 输出ParentMainTest_nostatic_n:11 }}public class SonMainTest extends ParentMainTest{` SonMainTest(int a){ //step8:执行new SonMainTest构造函数 //默认调用父类的无参构造函数 super(); step9:加载实例成员变量与成员代码块 this.a=a; //step14:将实例变量赋值 a=8 System.out.println("SonMainTest.a=" + this.a ); //step15:输出SonMainTest.a=8 } int a; //step12:加载实例变量 默认值为0; { System.out.println("SonMainTest_nostatic_a:"+this.a); //step13:加载成员代码块 输出SonMainTest_nostatic_a:0 } static{ //step5: 无类变量加载,加载静态代码块 x++; //step6: 获得父类的类变量值x=1,自增 x=2; System.out.println("SonMainTest_static..." +x);//step7: 输出SonMainTest_static...2 }}