2012-08-16 65 views
7

我以前讀過Java類是類Class的實例。但是現在,我的計算機科學老師說Java類不是對象。Java類對象?

這是真的嗎?

+0

當你問他時,他給你什麼理由? – EJP 2012-08-17 00:24:39

+0

@EJP他說過一個類是一個接口,但我不記得整個事情。 – itdoesntwork 2012-08-18 14:07:18

+0

Java類確實是對象,即使是一種特殊的對象。例如,您可以有任何給定類SomeClass的多個實例:只需創建一個新的ClassLoader並再次加載「SomeClass」您會爲同一個編譯時類獲得不同的實例,可能會使用不同的方法實現。 – 2013-08-16 19:00:53

回答

15

Java類不是一個對象。

但是,每個Java類都有描述它的Class類的實例。
這些實例是對象。

+0

我認爲這很重要,你的意思是「一個Java類」。 「類」的定義是不是一個對象?其中包含類聲明的源代碼? – 2012-08-16 15:12:58

+0

因此,類「Class」的實例與使用'class'關鍵字創建的類不同。得到它了。 – itdoesntwork 2012-08-16 15:16:26

+0

@MattBall:一個類是一個類型,而不是一個對象。 – SLaks 2012-08-16 15:47:09

0

每個Java類,即使java.lang.Class下降從java.lang.Object

編輯:

措辭有點模棱兩可。 Java類的實例絕對是對象。班級本身並不能真正成爲對象,因爲除了班級「藍圖」之外,什麼都不存在於記憶中。

+0

Class對象確實存在於內存中。考慮Object.getClass()的結果。 – EJP 2012-08-17 00:25:51

+0

@EJP不知道你說的是什麼。當你有這個類的實例時,getClass()纔有效,是的。我從來沒有說過。我的觀點是,除非你有一個實例,否則內存中沒有任何東西,只有JVM中的類的映射(藍圖)。 – jn1kk 2012-08-17 00:43:01

+0

@EJP我覺得很愚蠢,我們是在爭論和拿走別人的虛擬互聯網點,因爲這個問題本身就是模棱兩可的。我發現這更愚蠢,我甚至試圖回答這個問題。 – jn1kk 2012-08-17 00:52:12

1

該類(您的代碼,甚至是.class文件中的編譯代碼)不是對象。在實例化該類之前,您沒有對象。

例如,Java.lang.String是一類。 String s = new String("Hello world");定義了一個String類型的對象。這可能是你教授正在做出的區分。

+0

同樣,這裏「類」這個詞的定義很重要。 – 2012-08-16 15:14:43

+0

同意,這就是爲什麼我指定我的答案指的是'類' – 2012-08-16 15:16:37

3

Java類不是對象,它們是抽象的。

但是,每個Java類都有一個表示它的類的java.lang.Class的對應實例。該表示的一個對象。但是你不應該把這個表示理解爲實際的東西。

這種關係有點類似於音樂和樂譜之間的關係。雖然書面符號代表音樂,但它本身不是音樂。

雖然這種差異很少在實踐中發揮作用,只要你知道你可以做什麼,不能做什麼就可以做到java.lang.Class對象。

+0

謝謝,這清除了它。編輯:讓我希望每種語言都像Ruby一樣簡單:) – itdoesntwork 2012-08-16 15:17:15

+0

雖然Ruby比Java更復雜得多。 – biziclop 2012-08-16 15:26:18