在下面这个例子中,咱们分别在父类和子类中测试了静态代码块、普通代码块、静态成员变量、普通成员变量、构造器、静态内部类。html
class Field{ public static String baseFieldInit(){ System.out.println("父类全局变量"); return ""; } public static String baseStaticFieldInit(){ System.out.println("父类静态变量"); return ""; } public static String fieldInit(){ System.out.println("子类全局变量"); return ""; } public static String staticFieldInit(){ System.out.println("子类静态变量"); return ""; } } class Father{ static { System.out.println("父类静态代码块1"); } private static String staticValue = Field.baseStaticFieldInit(); static { System.out.println("父类静态代码块2"); } { System.out.println("父类构造代码块1"); } private String value = Field.baseFieldInit(); { System.out.println("父类构造代码块2"); } Father(){ System.out.println("父类构造器"); } } public class Children extends Father { static { System.out.println("子类静态代码块1"); } private static String staticValue = Field.staticFieldInit(); static { System.out.println("子类静态代码块2"); } { System.out.println("子类构造代码块1"); } private String value = Field.fieldInit(); { System.out.println("子类构造代码块2"); } public Children(){ System.out.println("子类无参构造器"); } private static class House{ private static Children houseColor = new Children(); } /** * 测试类 */ public static void main(String[] args) { Children children = new Children(); System.out.println("Children:"+children); System.out.println("*******************************"); // 第二遍 Children children1 = new Children(); System.out.println("Children:"+children1); System.out.println("*******************************"); } }
父类静态代码块1 父类静态变量 父类静态代码块2 子类静态代码块1 子类静态变量 子类静态代码块2 父类构造代码块1 父类全局变量 父类构造代码块2 父类构造器 子类构造代码块1 子类全局变量 子类构造代码块2 子类无参构造器 Children:com.zhixie.jvmclassload.demo.Children@65b54208 ******************************* 父类构造代码块1 父类全局变量 父类构造代码块2 父类构造器 子类构造代码块1 子类全局变量 子类构造代码块2 子类无参构造器 Children:com.zhixie.jvmclassload.demo.Children@1be6f5c3 *******************************
public static void main(String[] args) { Children chouse = House.houseColor; System.out.println("ChildrenHouse:"+chouse); System.out.println("*******************************"); Children chouse1 = House.houseColor; System.out.println("ChildrenHouse:"+chouse1); System.out.println("*******************************"); }
父类静态代码块1 父类静态变量 父类静态代码块2 子类静态代码块1 子类静态变量 子类静态代码块2 父类构造代码块1 父类全局变量 父类构造代码块2 父类构造器 子类构造代码块1 子类全局变量 子类构造代码块2 子类无参构造器 ChildrenHouse:com.zhixie.jvmclassload.demo.Children@65b54208 ******************************* ChildrenHouse:com.zhixie.jvmclassload.demo.Children@65b54208 *******************************
通过咱们反复调整顺序进行测试后,可得出以下结论:
一、静态代码块、静态成员变量只有第一次加载类时才会执行。
二、执行顺序为:父类静态代码块及父类静态成员变量(并列优先级)--->子类静态代码块及子类静态成员变量(并列优先级)--->父类普通代码块及父类成员变量--->父类构造器--->子类普通代码块及子类成员变量--->子类构造器。
三、静态内部类,只有在第一次调用的时候才会被初始化。
下一章咱们会用今天的代码来学习一下类的加载顺序。java
若是文章对您有帮助,请记得点赞关注哟~ 欢迎你们关注个人公众号<情系IT>,每日技术推送文章供你们学习参考。jvm
原文出处:https://www.cnblogs.com/zhixie/p/11761642.html学习