java類加載及new對象的過程


/* 
SubClass sub = new SubClass(); 
這句話到底做了什么事情呢? 
1.javac編譯.java源文件形成.class字節碼文件; 
2.new SubClass()對象時,先檢查有沒有父類,有父類,類加載器(ClassLoader)先將父類的Class文件讀入內存,創建一個java.lang.Class對象,然后加載子類,類加載器將子類的Class文件讀入內存,創建一個java.lang.Class對象; 
3.先初始化父類的靜態屬性,再初始化父類的靜態代碼塊; 
4.再初始化子類的靜態屬性,再初始化子類的靜態代碼; 
5.在堆內存中分配內存空間,分配內存地址,此時是因為父類的特有屬性才在堆內存中為父類對象分配空間。 
6.初始化父類的特有屬性。 
7.初始化父類的構造代碼塊。 
8.初始化父類對象相應的構造方法。 
9.在堆內存中分配內存空間,分配內存地址,此時是因為子類的特有屬性才在堆內存中為子類對象分配空間的。 
10.初始化子類的特有屬性。 
11.初始化子類的構造代碼塊。 
12.初始化子類相應的構造方法。 
13.將子類的內存地址賦值給棧中的引用對象。 
*/ 
package com.zhangyike.staticExcise;

// 靜態變量 public static String staticField = "父類--靜態變量"; public String field = "父類--普通變量"; // 靜態塊 static { System.out.println(staticField); System.out.println("父類--靜態塊"); } // 初始化塊 { System.out.println(field); System.out.println("父類--普通塊"); } // 構造器 public ParentClass() { System.out.println("父類--構造器"); } } public class SubClass extends ParentClass { // 靜態變量 public static String sstaticField = "子類--靜態變量"; // 變量 public String sField = "子類--變量"; // 靜態塊 static { System.out.println(sstaticField); System.out.println("子類--靜態塊"); } // 初始化塊 { System.out.println(sField); System.out.println("子類--普通塊"); } // 構造器 public SubClass() { System.out.println("子類--構造器"); } public static void main(String[] args) { System.out.println("順序:" + "第一次new SubClass"); SubClass sub = new SubClass(); System.out.println("順序:" + "第二次new SubClass"); new SubClass(); } } 

程序執行的結果為: 
父類–靜態變量 
父類–靜態塊 
子類–靜態變量 
子類–靜態塊 
順序:第一次new SubClass 
父類–普通變量 
父類–普通塊 
父類–構造器 
子類–變量 
子類–普通塊 
子類–構造器 
順序:第二次new SubClass 
父類–普通變量 
父類–普通塊 
父類–構造器 
子類–變量 
子類–普通塊 
子類–構造器


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM