Je suis incapable de comprendre le texte suivant ... Cela signifie-t-il que <clinit>
c'est pour les constructeurs vides? Pourquoi est-il important d'avoir deux versions différentes?
https://docs.oracle.com/javase/specs/jvms/se7/html/jvms-2.html
2.9. Special Methods
Au niveau de la machine virtuelle Java, chaque constructeur (§2.12) apparaît comme une méthode d'initialisation d'instance portant le nom spécial
<init>
. Ce nom est fourni par un compilateur. Comme le nom<init>
n'est pas un identifiant valide, il ne peut pas être utilisé directement dans un programme écrit dans le langage de programmation Java. Les méthodes d'initialisation d'instance ne peuvent être appelées que dans la machine virtuelle Java par l'instruction invokespecial, et elles ne peuvent être appelées que sur des instances de classe non initialisées. Une méthode d'initialisation d'instance prend les droits d'accès (§2.7.4) du constructeur dont elle est dérivée.Une classe ou une interface a au plus une méthode d'initialisation de classe ou d'interface et est initialisée (§2.17.4) en invoquant cette méthode. La méthode d'initialisation d'une classe ou d'une interface est statique et ne prend aucun argument. Il a le nom spécial
<clinit>
. Ce nom est fourni par un compilateur. Comme le nom<clinit>
n'est pas un identifiant valide, il ne peut pas être utilisé directement dans un programme écrit dans le langage de programmation Java. Les méthodes d'initialisation de classe et d'interface sont appelées implicitement par la machine virtuelle Java; ils ne sont jamais appelés directement à partir d'une machine virtuelle Java dansw2struction, mais ne sont invoqués qu'indirectement dans le cadre du processus d'initialisation de classe.
CL
?<init>
désigne un constructeur,<clinit>
désigne un initialiseur statique : "Static Initialization Blocks" dans le didacticiel Java , initialiseur statique en Java .la source
La différence entre
<init>
et<clinit>
est qu'elle<init>
est utilisée pour les méthodes de constructeur qui initialisent une instance d'objet, alors qu'elle<clinit>
est utilisée pour initialiser l'objet de classe lui-même. Par exemple, l'initialisation de tousstatic
les champs de niveau de classe est effectuée<clinit>
lorsque la classe est chargée et initialisée.la source
Juste pour ajouter Si vous utilisez la méthode Class.forName, elle initialise uniquement la classe. Donc, à partir de cette méthode, il n'appelle que clinit et lorsque vous utilisez newInstance sur l'objet retourné par forName, il appellera init pour l'initialisation de l'instance. Vous pouvez utiliser le code ci-dessous pour le voir dans le débogage.
Pour tester, utilisez
la source