主要内容是关于静态初始化和构造器的执行顺序的问题
class Root { static { System.out.println("Root的静态初始化代码块"); } { System.out.println("Root的普通初始化代码块"); } public Root() { System.out.println("Root的无参数的构造器"); } } class Mid extends Root{ static { System.out.println("Mid的静态初始化代码块"); } { System.out.println("Mid的普通初始化代码块"); } public Mid() { System.out.println("Mid的无参数构造器"); } public Mid(String msg) { //通过this调用同一类中的重载构造器 //this(); System.out.println("Mid的带参数构造器,其参数值为:" + msg ); } } class Leaf extends Mid { static { System.out.println("Leaf的静态初始化代码块"); } { System.out.println("Leaf的普通初始化代码块"); } public Leaf() { //通过super调用父类中有一个字符串参数的构造器 super("急速测试"); System.out.println("执行Leaf的构造器"); } } public class Test { public static void main(String [] args) { System.out.println("test"); new Leaf(); new Leaf(); } }
代码输出如下
test Root的静态初始化代码块 Mid的静态初始化代码块 Leaf的静态初始化代码块 Root的普通初始化代码块 Root的无参数的构造器 Mid的普通初始化代码块 Mid的带参数构造器,其参数值为:急速测试 Leaf的普通初始化代码块 执行Leaf的构造器 Root的普通初始化代码块 Root的无参数的构造器 Mid的普通初始化代码块 Mid的带参数构造器,其参数值为:急速测试 Leaf的普通初始化代码块 执行Leaf的构造器
我粗略了解载入Leaf
类的时候,会先创建父类(直至java.lang.Object
)的初始化代码和构造器,那么
他们的顺序是否如下:
Root类静态初始化代码块 -->Mid类静态初始化代码块 -->Leaf类静态初始化代码块 -->Root类普通初始化代码块 -->Root类构造器 -->... -->Leaf类Root类普通初始化代码块 -->Leaf类的构造器
如果Leaf
类的构造器的执行顺序在父类的构造器之后,那么为什么Mid
类的有参数构造器已经被传入参数急速测试
呢?
可能描述得不是很清楚,如果有疑问请指出来,我会尽量描述清楚的
感谢您抽空查看
付费偷看金额在0.1-10元之间
具体你自己分析。
首先,使用javac命令编译java类后,该java类的初始化代码块会消失——初始化代码块中的代码会被“还原”到每个构造器中,且位于构造器所有代码前面。
基本流程:
一周热门 更多>