首页 > 编程 > Java > 正文

java中static代码块与构造方法的执行顺序

2019-11-10 20:39:27
字体:
来源:转载
供稿:网友

今天在微信群里有朋友问了我一道面试题,作为一个屌丝程序猿,竟然不明其中的奥秘,特此写下此题与学习过程,仅此勉励。

class A {	static {		System.out.PRint("1");	}	public A() {		System.out.print("2");	}}class B extends A {	static {		System.out.print("a");	}	public B() {		System.out.print("b");	}}public class Hello {	public static void main(String[] args) {		A ab = new B();		System.out.println();		ab = new B();	}}此题考点在于继承多态中的构造方法和静态代码块的相关知识。

首先static代码块会在类被加载的时候执行且仅会被执行一次,当父类和子类有static的时候,执行顺序是先初始化父类的Static,再初始化子类的Static,再初始化父类的其他成员变量->父类构造方法->子类其他成员变量->子类的构造方法。父类上层还有父类时,总是先执行最顶层父类的Static-->派生类Static-->派生类Static-->.......-->子类Static-->顶层父类的其他成员变量-->父类构造方法--> 派生类的其他成员变量 --> 派生类构造方法--> ...............-->子类其他成员变量-->子类构造方法

因此class B继承于class A,所以在A ab = new B()的时候,会先执行父类也就是A类的static代码块,然后执行子类就是B类的static代码块,然后执行父类构造方法,最后执行子类构造方法。执行结果为1a2b。

当执行到ab = new B()时,static代码块已经执行过一次了,所以不会再次执行,这行的结果为2b。

综上,最终的结果为:

1a2b2b

希望与我同样对static、构造方法执行顺序不是很清楚的小伙伴共勉!

参考如下博客,感谢博主的无私奉献:

http://blog.csdn.net/zhanghaotian2011/article/details/9040935

http://www.jb51.net/article/36038.htm


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表