关于静态代码块和匿名代码块以及结构体在程序运行过程中的调用顺序实验
今天学习JAVA看到了static修饰符部分,讲到了有关匿名代码和静态代码部分。此时又突然想到前面所学关于new是调用类的结构体知识,同时结合继承关系,想看看在这些条件下匿名代码块、静态代码块以及类构造体的调用顺序。
编写了三个小文件,代码如下:
- Application(带main()执行函数)
- Person(父类)
- Student(子类)
程序运行结果如下:
首先看第一部分执行结果,对于简单的new且类型与指向相同时,运行结果表明,首先将调用Person的2个代码块,之后再调用类构造体。代码块又以静态代码块优先调用。
第二部分运行结果就很有意思了。当类中出现继承关系时,首先读取Student类时先加载了Student的静态代码。这个可以理解,带有static修饰符的方法和属性在类被调用时也会一并加载。但是实例化过程中,由于继承关系的出现,程序进入Person类中并依次加载了匿名代码块以及类构造体,之后再返回Student类中加载匿名代码块和构造体。因此可以看到,出现继承时会加载父类中的匿名和类构造体,而不会加载静态代码块,即一部分对类的初始设定就不会加载,而仅仅在实例化后读取父类中的方法。
第三部分代码略有不同,"Person student1 = new Student();",此时类型为Person但是实例化调用了Student。此时从结果可以看到,整个运行结果中静态代码块就没出现了,取而代之的是从左边的Person类的匿名代码块-->类构造体再到右边的Student类的匿名代码块-->类构造体。
实验总结:
-
静态代码在new中是否调用取决于类型和指向是否相同。如果相同,则出现调用,且一定在首位;如果不同则不调用。
-
如果出现在new中出现继承关系或者类型和指向不一致时,会依次调用父类的匿名代码块、构造体以及子类的匿名代码块和构造体。
后话:
这个东西只是我突发奇想整的,具体能怎么用还有待观察,毕竟菜鸟刚刚入坑。同时,如果父类往上还有继承关系会出现什么情况,有兴趣的可以自己去试试。如果有懂这部分背后原理的大佬可以解释一下,本人感激不尽。