Java:请问这段代码的执行顺序是怎么样的,如果能够详细点更好,谢谢
这是一道关于Java 类的初始化顺序的问题,目前可以懵懂(思维混乱)地知道初始化顺序为 成员变量->构造方法->成员方法 ,静态代码块->构造代码块->构造方法, 但是感觉很混乱,希望能够通过下面这道题理顺一下
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
题主可以通过编译后的
class
文件反编译来帮助理解初始化过程。在命令行中的指令
javap -l -c -p -v App
,执行后就会得到反编译后的内容,下面结合题主给的源码简单分析一下:下面展示和初始化有关的部分反编译内容
App
的class文件SubClass
的class文件SuperClass
的class文件大致解释一下内容(如果题主对
JVM指令集
感兴趣可以看看JVM
规范,里面有很详细的解释)。上面反编译内容中星号部分是我加上的注解。按照代码的执行顺序:
1.JVM加载
App
类,App
中的静态变量在这时会初始化,对应App中调用App的构造函数
的字节码2.跳到
App
的构造函数,先初始化父类Object
,对应App中调用Object的构造函数
3.初始化实例变量
SubClass
,对应App中调用SubClass的构造函数
4.此时要先加载
SubClass
类,同时初始化静态变量并执行静态块,对应SubClass中静态块
5.这时执行
SubClass
中的代码打印出“1”6.
SubClass
加载完成后执行构造函数,对应SubClass中构造函数
7.
SubClass
构造函数最开始是执行SuperClass
的构造函数,对应SubClass中调用SuperClass的构造函数
8.执行
SuperClass
中构造函数中的代码打印出“得到字符串构造SuperClass”9.
SuperClass
构造完成return
到7中的代码位置,继续执行SubClass
剩余的代码10.执行
SubClass
中构造函数代码打印出“2”11.执行完
SubClass
构造函数return
到3中的代码位置,继续执行App
剩余的代码12.执行
App
中构造函数代码打印出“4”13.执行完
App
的构造函数return
到1中代码位置,继续初始化的静态变量14.执行静态块中的方法,答应出“3”
15.进入到
main
入口方法,打印出“Hello”上面的过程就是大致的执行顺序。
回答的内容可能会有点混乱,题主看不懂的地方可以问我。
类变量(静态变量)>静态块>构造方法>普通成员变量>子类除静态外。JAVA所有static修饰的都会在编译时分配空间,而对象只会在使用时才分配即new的时候,子类继承父类很明显需要先给父类分配,没有父亲哪来的儿子是吧