今天在微信群里有朋友问了我一道面试题,作为一个屌丝程序猿,竟然不明其中的奥秘,特此写下此题与学习过程,仅此勉励。
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
新闻热点
疑难解答