Voici ce que JavaDoc dit:
public final Class <?> getClass()
Retourne la classe d'exécution de cette
Object
. L'objetClass
renvoyé est l'objet qui est verrouillé par les méthodesstatic synchronized
de la classe représentée.
Le type de résultat actuel estClass<? extends |X|>
, où|X|
est l'effacement du type statique de l'expression sur laquellegetClass
est appelé. Par exemple, aucun transtypage n'est requis dans ce fragment de code:Number n = 0; Class<? extends Number> c = n.getClass();
Retourne:
Objet de classe représentant la classe d'exécution de cet objet.
Maintenant, je comprends que c'est une méthode native, elle est donc implémentée dans du code dépendant de la plate-forme. Mais qu'en est-il du type de retour de cette méthode.
public final Class<?> getClass()
Aussi, considérons le code:
class Dog
{
@Override
public String toString()
{
return "cat";
}
}
public class Main
{
public static void main(String[] args)
{
Dog d= new Dog();
//Class<Dog> dd = new Dog(); Compile time error
System.out.println(d.getClass());
}
}
Sortie:
classe chien
Donc, ma question réside dans:
Les données de chaque objet contiennent une référence à un objet de la classe Java.lang.Class, qui est renvoyé par la méthode getClass. Il existe également un objet Java.lang.Class décrivant Java.lang.Class.
Pensez à un objet de classe en tant que "modèle" décrivant une certaine classe à partir de laquelle les objets sont créés. Il va de soi que les plans directeurs ont également besoin d'un plan directeur (sinon, comment les ingénieurs sauraient-ils comment fabriquer des plans)?.
Ces déclarations tentent d’illustrer cela.
Integer integer = 1;
Class<?> clazzInteger = integer.getClass();
System.out.println( "class of integer=" + clazzInteger );
Class<?> clazzClazzInteger = clazzInteger.getClass();
System.out.println( "class of class Integer's class=" + clazzClazzInteger );
String string = "x";
Class<?> clazzString = string.getClass();
System.out.println( "class of string=" + clazzString );
Class<?> clazzClazzString = clazzString.getClass();
System.out.println( "class of class String's class=" + clazzClazzString );
Sortie:
class of integer=class Java.lang.Integer
class of class Integer's class=class Java.lang.Class
class of string=class Java.lang.String
class of class String's class=class Java.lang.Class
Une classe a un nom, tout comme tout ce qui est décrit par un plan a un nom à ne pas confondre avec le plan lui-même. Si un objet de classe apparaît dans un certain contexte, sa méthode toString () est appelée implicitement, ce qui retourne la classe ' name . Si vous souhaitez imprimer tous les détails d'une classe (ce qui s'apparente à l'impression du plan directeur lui-même), vous devez écrire beaucoup de code - il suffit de regarder le javadoc pour Java.lang.Class: il y a beaucoup d'informations à récupérer (comme il convient à un plan).
À ce stade, nous devons faire la différence entre une type
et une instance
du type. Permet de l'expliquer avec un exemple.
public class A {
public static void main(String[] args) {
Class<A> typeInformation = A.class; //Type information associated with type `A`
A instanceOfA = new A(); //actual instance of type `A`
}
}
Type
La référence 'typeInformation' dans le code ci-dessus est du type Class
en laissant de côté les génériques pendant un moment. Ces informations résideront généralement dans une section de mémoire non en tas. Les informations suivantes sont stockées dans chacune des charges type
jvm:
Instance
instaneOfA est une référence à l'instance réelle du type A
qui pointe vers une adresse dans la mémoire heap.
Le type de retour de getClass () est un type générique Class
. Comme beaucoup d'autres type
s disponibles en Java - Chaîne, Entier, etc., Class est également un type représentant les informations de type associées.
la méthode toString () est associée et appelée sur une variable instance
de la classe Dog et non sur le type Dog lui-même.
//Class<Dog> dd = new Dog(); Compile time error
Cela est dû à une incompatibilité de type lors de l'affectation du résultat de l'expression du côté droit au côté gauche, qui n'est pas du même type. La classe dd fait référence à une référence de type classe. Chien est un type complètement différent, et un nouveau Chien () peut être affecté à une référence du type 'Chien'.
Ce lien vous aidera à comprendre les aspects de la conception de l'environnement d'exécution Java
J'ai une réponse pour votre question 3,
Cela donne une erreur de compilation car
Raison 1: pour une instance de classe, vous pouvez uniquement affecter un objet de classe représentant la classe Dog, mais vous ne pouvez pas affecter l'objet de classe Dog directement.
Par exemple: Class dd = Dog.class ou Class dd = Class.forName ("Dog"); Est une syntaxe correcte.
Raison 2: La classe Class est une classe finale, mais pas une super classe pour la classe Dog. Vous revenez au concept de répartition dynamique des méthodes en Java, dans lequel vous ne pouvez affecter des objets de sous-classe qu'à une variable de superclasse.