Java類載入及建立例項(new)順序
阿新 • • 發佈:2019-02-11
Java類載入
1.JVM( Java Virtual Machine,“Java虛擬機器” )的類裝載器ClassLoader(java類),包括系統類、擴充套件類、使用者編寫三種類載入器,負責將java的位元組碼檔案從硬碟讀取到JVM中(記憶體),即首次載入java類時,類的靜態成員開闢空間,將常量池存放在方法區記憶體中,對常量池地址解析,並對java類的靜態成員變數、靜態塊、靜態方法進行一次初始化。靜態資源在類載入到記憶體時,只加載一次,而new的物件和物件塊,每次都會載入。
2.在使用new關鍵字時,才會建立類的例項
類例項(物件)的建立(構造):先構造父類物件,再構造子類物件
物件構造步驟:
①遞迴的構造父類的物件(父類物件的構造也為①~③);
②順序地呼叫本類成員屬性賦初值語句;
③本類的構造方法。
3:物件銷燬:先銷燬子類,再銷燬父類
例如:
第一次載入類,類的靜態成員按照類中出現的順序載入:
父類ParentCL:
package com.classx; public class ParentCL{ //類靜態屬性 public static int idp = staticForFieldByMethodOfP(); //構造方法 public ParentCL(){ System.out.println("父類構造方法-執行"); } //非靜態初始化塊 { System.out.println("父類的非靜態初始化塊-執行"); } //靜態初始化塊 static{ System.out.println("父類的靜態初始化塊-執行"); } //類靜態方法 public static void staticMethodByP(){ System.out.println("父類的靜態方法-執行"); } //類靜態方法 public static int staticForFieldByMethodOfP(){ System.out.println("父類的靜態屬性-執行"); return 4466; } @Override protected void finalize() throws Throwable { System.out.println("父類銷燬方法"); super.finalize(); } }
子類ChildCL:
package com.classx; public class ChildCL extends ParentCL{ //類靜態屬性 public static int idc = staticForFieldByMethodOfC(); //構造方法 public ChildCL(){ System.out.println("子類構造方法-執行"); } //非靜態初始化塊 { System.out.println("子類的非靜態初始化塊-執行"); } //靜態初始化塊 static{ System.out.println("子類的靜態初始化塊-執行"); } //類靜態方法 public static void staticMethodByC(){ System.out.println("子類的靜態方法-執行"); } //類靜態方法 public static int staticForFieldByMethodOfC(){ System.out.println("子類的靜態屬性-執行"); return 5555; } @Override protected void finalize() throws Throwable { System.out.println("子類銷燬方法"); super.finalize(); } }
類載入呼叫:
package com.classx;
public class Classxloadernew {
public static void main(String[] args) {
ParentCL.staticMethodByP();
}
}
輸出為:
父類的靜態屬性-執行
父類的靜態初始化塊-執行
父類的靜態方法-執行
new使用測試:
package com.classx;
public class Classxloadernew {
public static void main(String[] args) {
ChildCL ccl = new ChildCL();
}
}
輸出為:
父類的靜態屬性-執行
父類的靜態初始化塊-執行
子類的靜態屬性-執行
子類的靜態初始化塊-執行
父類的非靜態初始化塊-執行
父類構造方法-執行
子類的非靜態初始化塊-執行
子類構造方法-執行
銷燬測試:
package com.classx;
public class Classxloadernew {
public static void main(String[] args) {
ChildCL ccl = new ChildCL();
ccl = null;
System.gc();
}
}
輸出為:
父類的靜態屬性-執行
父類的靜態初始化塊-執行
子類的靜態屬性-執行
子類的靜態初始化塊-執行
父類的非靜態初始化塊-執行
父類構造方法-執行
子類的非靜態初始化塊-執行
子類構造方法-執行
子類銷燬方法
父類銷燬方法