class="java">/* * * All Rights Reserved. */ package com.thinkInJava.chapter05; public class Father { public Father() { System.out.println("Father"); } static { System.out.println("I am Father class"); } { System.out.println("Father Class"); } }
?
子类:
?
package com.thinkInJava.chapter05; public class Sun extends Father{ public Sun(){ System.out.println("Sun"); } static{ System.out.println("I am sun class"); } { System.out.println("sun class"); } public static void main(String[] args) { new Sun(); } }
运行结果:
I am Father class
I am sun class
Father Class
Father
sun class
Sun
?
当 类在进行初始化时一定是先初始化父类中的静态的内容,父类静态的内容出事完毕后,会初始化子类中的静态内容,然后会再次查看父类中是否存在非静态的内容, 如果有则进行初始化,然后回到子类中查找是否存在非静态的内同需要初始化,如果有则进行初始化。最后执行父类中的构造方法,父类构造方法执行完后执行子类 的构造方法。
总结:
父类的静态语句块---》子类的静态语句块---》父类的构造语句块---》子类的构造语句块---》父类的构造方法---》子类的构造方法。
?
在进一步改进一下子类中main方法结果会是怎样呢?
public static void main(String[] args) { new Sun(); System.out.println("==================="); new Sun(); }
运行结果:
I am Father class
I am sun class
Father Class
Father
sun class
Sun
===================
Father Class
Father
sun class
Sun
从运行结果看到红色变大的字体部分属于父类和子类中的静态内同:运行顺序依然是:父类的静态语句块---》子类的静态语句块---》父类的构造语句块---》子类的构造语句块---》父类的构造方法---》子类的构造方法。
但是我们在main方法中创建了两个子类对象,但是静态内同值初始化一次,而构造语句块每次都会初始化,这也是构造语句块和静态语句块的区别。
?
再次修改子类中的main方法
public static void main(String[] args) { System.out.println("main start"); new Sun(); System.out.println("==================="); new Sun(); System.out.println("main end"); }
运行结果如下:
I am Father class
I am sun class
main start
Father Class
Father
sun class
Sun
===================
Father Class
Father
sun class
Sun
main end
通过运行结果可以看到完整的执行顺序为:父类的静态语句块---》子类的静态语句块---》main方法---》父类的构造语句块---》子类的构造语句块---》父类的构造方法---》子类的构造方法。