2015-08-09 71 views
-3

我一直在閱讀關於JAVA和我對Class類的困惑。假如說你有這個代碼在這裏:班級類型返回

class C {} 

public class NewClass { 

    public Class<?> f(Class<?> type){ 
    return type.getClass(); 
    } 

public static void main(String[] args) { 
    NewClass nc = new NewClass(); 
    C c = new C(); 
    System.out.println(nc.f(C.class));  
} 
} 

現在是真正令人驚訝的對我說的getclass返回java.lang.Class中的,而我期待它是packagename.C。它如何不顯示作爲Class類的實際類?另外,當我嘗試在f()中傳遞新的C()時,它不會編譯。即使c(C的參考)也不被接受。爲什麼會這樣?即使他們是相同的類對象/參考?爲什麼只有C.class,也就是類文字被接受爲Class類型?這真讓我困惑。如果有人可以請幫助?

由於事先

+0

閱讀更多關於java和OOP – RayanFar

回答

2

一類對象的類必須是Class,否則它不會是Class對象。

你在做什麼不是「什麼是C的類」,而是「當我打電話給c.getClass()」(或C.class)時得到的對象的類是什麼,Class是什麼。

C c = new C(); // c is on Object of type "C" here 
Class<?> clz = c.getClass(); // clz is an Object of type "Class C" here. 
Class<?> clzClz = clz.getClass(); // clzClzs is always "Class" 

這對一個對象已經是一個Class對象,所以你的GET 「java.lang.Class中的」 召喚getClass()

public Class<?> f(Class<?> type){ // type IS already a "Class" object 
    return type.getClass(); // so this will always be "java.lang.Class" 
    } 

你可以替換成...

public Class<?> f(Object o){ 
    return o.getClass(); 
    } 

...然後它會在稍後返回「C」類。但當然,這種方法將是無用的,因爲它只有類getClass()

+0

感謝您的回覆。所以基本上我得到的是C類而不是C類的實例。這很有趣,因爲C.class實際上是我認爲的類對象。但是,你能告訴我,如果只有類文字可以作爲參數腳類傳遞嗎?就像我提到的,它不接受新的C();或c作爲參數?類類型參數只接受類文字?再次感謝。對不起,我的問題聽起來有點愚蠢。這讓你感到困惑。 –

+0

簡化後,對象的「類」只是此對象的另一個屬性,即所有對象都具有的屬性。而且這個屬性總是一個'Class'對象,它存儲了關於類名稱的信息等。例如,每個String都有一個名爲「java.lang.String」的Class對象作爲名稱。當然,現在,每個類對象本身也有類屬性,其名稱是「java.lang.Class」。如果在方法中給「類 ...」作爲參數,則只能將Class對象放在那裏。爲了獲得任何對象的Class對象,可以調用'getClass()'。 –

+0

所以我只是嘗試傳遞c.getclass()作爲參數,它的工作原理類似。所以你是對的,我們需要傳遞Class對象。所以現在我明白了爲什麼傳遞c不會工作,因爲它只是一個對象引用,並不是真正的對象本身。 –

0

這是因爲您正在將類實例傳遞給f()。你可以看到這樣的實際類:

class C {} 

public class NewClass { 

    public Class<?> f(Class<?> type){ 
    return type.getClass(); 
    } 

public static void main(String[] args) { 
    NewClass nc = new NewClass(); 
    C c = new C(); 
    System.out.println(c.getClass());  
} 
}