在下面這個例子中,咱們分別在父類和子類中測試了靜態代碼塊、普通代碼塊、靜態成員變量、普通成員變量、構造器、靜態內部類。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學習