Ici, je crée une instance de ma classe
Non, vous ne créez pas ici l'instance de votre classe abstraite. Vous créez plutôt une instance d'une sous - classe anonyme de votre classe abstraite. Et puis vous invoquez la méthode sur votre référence de classe abstraite pointant vers l' objet de sous-classe .
Ce comportement est clairement répertorié dans JLS - Section # 15.9.1 : -
Si l'expression de création d'instance de classe se termine par un corps de classe, la classe en cours d'instanciation est une classe anonyme. Alors:
- Si T désigne une classe, alors une sous-classe directe anonyme de la classe nommée par T est déclarée. Il s'agit d'une erreur au moment de la compilation si la classe indiquée par T est une classe finale.
- Si T désigne une interface, alors une sous-classe directe anonyme d'Object qui implémente l'interface nommée par T est déclarée.
- Dans les deux cas, le corps de la sous-classe est le ClassBody donné dans l'expression de création d'instance de classe.
- La classe en cours d'instanciation est la sous-classe anonyme.
Je souligne.
De plus, dans JLS - Section # 12.5 , vous pouvez lire sur le processus de création d'objet . Je vais en citer une déclaration ici: -
Chaque fois qu'une nouvelle instance de classe est créée, un espace mémoire lui est alloué avec de la place pour toutes les variables d'instance déclarées dans le type de classe et toutes les variables d'instance déclarées dans chaque superclasse du type de classe, y compris toutes les variables d'instance qui peuvent être masquées.
Juste avant qu'une référence à l'objet nouvellement créé soit renvoyée comme résultat, le constructeur indiqué est traité pour initialiser le nouvel objet à l'aide de la procédure suivante:
Vous pouvez lire la procédure complète sur le lien que j'ai fourni.
Pour voir pratiquement que la classe en cours d'instanciation est une sous- classe anonyme , il vous suffit de compiler vos deux classes. Supposons que vous placiez ces classes dans deux fichiers différents:
My.java:
abstract class My {
public void myMethod() {
System.out.print("Abstract");
}
}
Poly.java:
class Poly extends My {
public static void main(String a[]) {
My m = new My() {};
m.myMethod();
}
}
Maintenant, compilez vos deux fichiers source:
javac My.java Poly.java
Maintenant, dans le répertoire où vous avez compilé le code source, vous verrez les fichiers de classe suivants:
My.class
Poly$1.class // Class file corresponding to anonymous subclass
Poly.class
Voir cette classe - Poly$1.class
. Il s'agit du fichier de classe créé par le compilateur correspondant à la sous-classe anonyme que vous avez instanciée à l'aide du code ci-dessous:
new My() {};
Il est donc clair qu'il existe une classe différente en cours d'instanciation. C'est juste que, cette classe ne reçoit un nom qu'après compilation par le compilateur.
En général, toutes les sous-classes anonymes de votre classe seront nommées de cette manière:
Poly$1.class, Poly$2.class, Poly$3.class, ... so on
Ces nombres indiquent l'ordre dans lequel ces classes anonymes apparaissent dans la classe englobante.
B
d'une classe abstraiteA
, pendant la partie de construction d'B
instance, qui consiste à exécuterA
le constructeur de, le type d'exécution de l'objet est en faitA
. Seulement temporaire cependant.