Thinking In Java Part08(容器、簡單的容器分類、類加載器)

1、newInstance
	Class的newInstance()是實現“虛擬構造器”的一種途徑,虛擬構造器允許你聲明:我不知道你的確切類型,但是無論如何要正確地創建你自己。使用newInstance()來創建的類,必須帶有默認的構造器。
2、類字面常量
	一種爲Class.forname("xxx"),Java還提供了另一種方法生成對Class對象的引用,使用類字面常量。即Cookie.class
	當使用".class"來創建對Class對象的引用時,不會自動地初始化該Class對象。爲了使用類而做的準備工作實際包含三個步驟:
		17.1、加載,由類加載器執行的。該步驟將查找字節碼(通常在classpath所指定的路徑中查找,但這並非是必須的),並從這些字節碼中創建一個Class對象。
		17.2、鏈接。在鏈接階段將驗證類中的字節碼,爲靜態域分配存儲空間,並且如果必需的話,將解析這個類創建的對其他類的所有引用。
		17.3、初始化。如果該類具有超類,則對其初始化,執行靜態初始化器和靜態初始化塊。
		初始化被延遲到了對靜態方法(構造器隱式地是靜態的)或者非常數靜態域進行首次引用才執行。
3、instanceof與Class的等價性
	class Base {
	}

	class Derived extends Base {
	}

	public class InstanceofAndClass {
	    static void test(Object x) {
	       static void test(Object x) {
	        //base Derived
	        System.out.println("Testing x of type:" + x.getClass());
	        //true true
	        System.out.println("x instanceof Base:" + (x instanceof Base));
	        //false true
	        System.out.println("x instanceof Derived:" + (x instanceof Derived));
	        //true  true
	        System.out.println("Base.isInstance(x):" + Base.class.isInstance(x));
	        //false true
	        System.out.println("Derived.isInstance(x):" + Derived.class.isInstance(x));
	        //true false
	        System.out.println("x.getClass() ==Base.class:" + (x.getClass() == Base.class));
	        //false true
	        System.out.println("x.getClass() ==Derived.class:" + (x.getClass() == Derived.class));
	        //true false
	        System.out.println("x.getClass().equals(Base.class):" + (x.getClass().equals(Base.class)));
	        //false true
	        System.out.println("x.getClass().equals(Derived.class):" + (x.getClass().equals(Derived.class)));

    }

	    }

	    public static void main(String[] args) {
	        test(new Base());
	        test(new Derived());
	    }
	}

	instanceof和isInstance()生成的結果完全一樣,equals()和==也一樣。但是測試的結論卻不同。instanceof保持了類型的概念,指的是“你是這個類嗎,或者你是這個類的派生類嗎?”,而如果用==比較實際的Class對象,就沒有考慮繼承——它或者是這個確切的類型,或者不是。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章