2010-01-29 24 views
41

Z Java tutorial:Co to jest dosłownie w języku Java?

Wreszcie, istnieje również specjalny rodzaj dosłowne nazywany klasa dosłownego, utworzone w drodze nazwy typu i dołączanie „.class”; na przykład String.class. Odnosi się to do obiektu (typu Class), który reprezentuje sam typ.

Do jakiego rodzaju zmiennej można przypisać ten literał?

Podaj mały przykład, o ile to możliwe.

Odpowiedz

41
Class<String> c = String.class; 

Zapoznaj się z Javadoc for java.lang.Class aby zobaczyć, co można zrobić z jednego z tych małych facetów - głównie związane z refleksji

2

W przykładach jest cos takiego:

Class myClass = MyClass.class 

lub

MyClass.class.getResourceAsStream("config.properties"); 
28

Aby to zrozumieć, musisz zrozumieć, że String to instancja (obiekt) klasy Class. Literał łańcuchowy (np. "Jestem ciągiem") jest notacją, która reprezentuje instancję (obiekt) klasy String, podczas gdy klasa literalna (np. Hashtable.class) jest notacją reprezentującą instancję klasy Klasa.

+1

Niezłe wyjaśnienie. –

+0

@shinkou String jest instancją (obiektem) klasy Class. Dlaczego? Powinno to być "String.class jest instancją (obiektem) klasy klasowej", prawda? – Ani

+0

@Ani Sam ciąg jest również instancją klasy Class, której przypisano literalną klasę String.class. Pomyśl o 'String str =" Jestem ciągiem ";', gdzie 'str' ma przypisany literał łańcuchowy" Jestem ciągiem ". – shinkou

19

Dzięki innych dobrych odpowiedzi tutaj, wiesz co to jest, ale tutaj jest typowym przykładem użycia, które mogą wyjaśnić również:

private static Logger log = Logger.getLogger(YourClassHere.class); 

Jako kod wskazuje, że jest to linia dokąd inicjalizacji framework logowania (w tym przykładzie używam pakietu org.apache.log4j, ale zasada rozszerza się na inne frameworki). Metoda getLogger() wymaga literału klasy, więc wie, co rejestruje (tj. Klasa bieżącego obiektu).

+2

To jest około 1000 razy bardziej przydatne niż cytowanie JavaDocs lub jakiejś innej definicji; Dziękuję Ci! – Pureferret

3

Dosłowny sam jest MyClass. Jeśli napiszesz MyClass.class, otrzymasz odniesienie do obiektu klasy. Jeśli napiszesz new MyClass(), użyje literału, aby uzyskać instancję klasy obiektu, którą otrzymasz od MyClass.class. Z instancji dostajesz ten sam obiekt klasy, wywołując myClassInstance.getClass().

Nie jestem w 100% pewny, ale sam literał nie może być przypisany do żadnej zmiennej. Możesz zrobić, aby nazwa klasy była łańcuchem znaków i użyć struktury refleksyjnej do utworzenia instancji.

+0

Pewnie, że możesz. Jeśli nie, nie można przekazać go jako parametru do funkcji. Typem literału jest klasa , którą można przypisać do referencji tego typu. – jbruni

+0

Dosłowny sam nie jest nazwą klasy. Na https://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-15.8.2 literałem klasy jest token 'class'. W języku JLS: "Literał klasy jest wyrażeniem składającym się z nazwy klasy, interfejsu, tablicy lub typu pierwotnego lub pustki typu pseudo-typu, po której następuje znak". " i klasa tokena. " Zauważ, że nie jest to nazwa klasy, ale nazwa zawierająca ".class". –

10

Według the JLS

15.8.2 literale klasy

Klasa dosłownym jest ekspresja składa się z nazwy, klasy interfejsu, tablicy lub pierwotnych następnie . i tokena class. Typ literału klasy to Class.Oblicza obiekt klasy dla określonego typu (lub dla void) zgodnie z definicją klasy definiującą moduł ładujący klasy bieżącej instancji.

1

Aby to zrozumieć, musisz zrozumieć, że String to instance (object) jego superclass (parent class)Object.

class String wartość jest instance (object) jest to String literal (np "I am a string.")

class | instance (object) | literal 
------------------------------------------------ 
String | instance_name = | "I am a string." 

natomiast class Object wartość jest instance (object) jest to Class literal - (np Hashtable.class), który odnosi się do class Hashtable jest instance (object)

class  | instance (object) | literal 
------------------------------------------------ 
Hashtable | instance_name  | Hashtable. 
+0

'String' nie jest instancją niczego, a na pewno nie jest żadną z nadklas. –

0

Gdy JVM ładuje twoje klasy aplikacji, przechowuje je pod numerem java.class.Class obiektów. Zwykle w pamięci występuje kilka instancji typu Class, które reprezentują klasy. Możesz zrobić coś takiego:

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