1、dog dog = new dog();
這個動作會導致常量池的解析,dog類被隱式裝載。
如果當前classloader無法找到dog,則丟擲noclassdeffounderror。
2、class clazz = class.forname(「dog」);
object dog =clazz.newinstance();
通過反射載入型別,並建立物件例項
如果無法找到dog,則丟擲classnotfoundexception。
3、class clazz = classloader.loadclass(「dog」);
object dog =clazz.newinstance();
通過反射載入型別,並建立物件例項
如果無法找到dog,則丟擲classnotfoundexception。
那麼,1和2和3究竟有什麼區別呢?分別用於什麼情況呢?
1和2使用的類載入器是相同的,都是當前類載入器。(即:this.getclass.getclassloader)。
3由使用者指定類載入器。
如果需要在當前類路徑以外尋找類,則只能採用第3種方式。第3種方式載入的類與當前類分屬不同的命名空間。
當前類載入器命名空間對其不可見。當然,如果被載入類的超類對於當前類命名空間可見的話,則可以進行強制轉型。
第1和第2種情況區別不大。如果,dog類在編譯時無法得到,則使用第2種方式。
另外,第1種和第2種都會導致類被初始化,即:執行類的靜態初始化語句,而第3種情況不會。
另外注意,第1種丟擲error,第2、3種丟擲exception,它們分屬於不同的異常/錯誤分支。
**:
類載入順序
1.載入靜態成員 塊 先遞迴地載入父類的靜態成員 塊 object的最先 再依次載入到本類的靜態成員。同乙個類裡的靜態成員 塊,按寫 的順序載入。如果其間呼叫靜態方法,則呼叫時會先執行靜態方法,再繼續載入。同乙個類裡呼叫靜態方法時,可以不理會寫 的順序。呼叫父類的靜態成員,可以像呼叫自己的一樣 但呼...
類載入順序
靜態變數 靜態塊 構造塊 建構函式執行順序 先看乙個demo parent類 created by flh on 2017 8 20.public class parent static public static int i getint public static int getint stat...
類載入順序
目錄 一 類載入做了哪些事?二 類載入的順序 三 乙個具體說明的例子 四 類載入前和載入後的執行順序 自 之前沒有進行類載入 1.類載入,同時初始化類中靜態的屬性 賦預設值 2.執行靜態 塊 3.分配記憶體空間,同時初始化非靜態的屬性 賦預設值 4.如果宣告屬性的同時有顯示的賦值,那麼進行顯示賦值把...