最後,還有一個特殊的文字稱爲類文字,通過採取類型名稱並追加「
.class
」形成的;例如,String.class
。這是指表示類型本身的對象(類型爲Class
)。
要將此文字分配給哪種類型的變量?
請給一個小例子,如果可能的話。
最後,還有一個特殊的文字稱爲類文字,通過採取類型名稱並追加「
.class
」形成的;例如,String.class
。這是指表示類型本身的對象(類型爲Class
)。
要將此文字分配給哪種類型的變量?
請給一個小例子,如果可能的話。
Class<String> c = String.class;
退房的Javadoc for java.lang.Class
看到你可以用這些小傢伙一個做的 - 大多與反射
在示例中它是成才這樣的:
Class myClass = MyClass.class
或
MyClass.class.getResourceAsStream("config.properties");
要了解這一點,你必須明白,字符串是類類的實例(對象)。字符串文字(例如「我是字符串」)是表示類字符串的實例(對象)的符號,而類文字(例如Hashtable.class)是表示類的實例的符號類別。
感謝這裏的另一個很好的答案,你知道它是什麼,但這裏可能還澄清一個典型的使用例子:由於代碼表明
private static Logger log = Logger.getLogger(YourClassHere.class);
,這是我們正在初始化,其中一條線一個日誌框架(在這個例子中,我使用的是org.apache.log4j
包,但原理擴展到其他框架)。 getLogger()
方法需要一個類文字,以便它知道它正在記錄什麼(即當前對象的類)。
這比引用JavaDocs或其他一些定義大約多1000倍。謝謝! – Pureferret 2012-09-14 10:21:54
字面本身是MyClass
。如果你寫MyClass.class
,你會得到一個對類對象的引用。如果你寫new MyClass()
,它使用文字來獲得你在MyClass.class
得到的類對象的一個實例。從實例中,通過調用myClassInstance.getClass()
獲得相同的類對象。
我不是100%確定,但文字本身不能分配給任何變量。你可以做的是獲得類的名字作爲字符串,並使用反射框架來創建一個實例。
當然可以。否則,您將無法將其作爲參數傳遞給函數。文字的類型是類
字面本身不是類名。根據https://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-15.8.2,類文字是標記'class'。從JLS開始:「類文字是由類,接口,數組或原始類型的名稱組成的表達式,或者是僞類型void,後跟'。'。和令牌類「。請注意,它不是該類的名稱,而是名稱後跟「.class」。 – 2016-12-01 22:38:35
根據the JLS
15.8.2類字面
類文字是由類,接口,數組名的表達,或後跟一個
.
和令牌基本類型class
。類文字的類型是Class
。它根據當前實例類的定義類加載器的定義,對指定類型(或void
)的Class對象進行求值。
一些常見用途可在Class Literals as Runtime-Type Tokens中找到。
要了解這一點,您必須明白String
是其superclass (parent class)
Object
的instance (object)
。
class String
的instance (object)
的值是一個String literal
(例如"I am a string."
):
class | instance (object) | literal
------------------------------------------------
String | instance_name = | "I am a string."
而class Object
的instance (object)
的值是一個Class literal
- (例如Hashtable.class
),其指的是class Hashtable
的instance (object)
class | instance (object) | literal
------------------------------------------------
Hashtable | instance_name | Hashtable.
'String'不是任何事物的實例,當然也不是任何超類。 – 2016-12-01 22:40:05
當JVM加載應用程序類時,它將它們存儲在java.class.Class
對象。所以,在內存中通常有幾個類型爲Class
的實例代表你的類。所以你可以這樣做:
Class<Bicycle> bicycleClass = Bicycle.class; // returns the object storing your Bicycle class
bicycleClass.getName(); // returns your class name
bicycleClass.getDeclaredMethods(); // returns your (declared) class methods
很好的解釋。 – 2013-07-18 10:53:02
@shinkou String是Class類的一個實例(對象)。怎麼來的?它應該是「String.class是Class類的一個實例(對象)」吧? – Ani 2015-08-04 20:16:17
@Ani字符串本身也是被分配類類型字符串String.class的類Class的一個實例。想想'String str =「我是一個字符串」;',其中'str'被分配了一個字符串字面值「我是一個字符串」。 – shinkou 2015-11-16 17:15:45