Java: Quelle est la différence entre et ?

Je n’arrive pas à comprendre le texte suivant … Est-ce que cela signifie que 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 . Ce nom est fourni par un compilateur. Comme le nom n’est pas un identifiant valide, il ne peut pas être utilisé directement dans un programme écrit en langage de programmation Java. Les méthodes d’initialisation d’instance peuvent être appelées uniquement dans la machine virtuelle Java par l’instruction invokespecial et elles peuvent être appelées uniquement sur des instances de classe non initialisées. Une méthode d’initialisation d’instance prend les permissions d’access (§2.7.4) du constructeur dont elle est issue.

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 appelant 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 . Ce nom est fourni par un compilateur. Le nom n’étant pas un identifiant valide, il ne peut pas être utilisé directement dans un programme écrit en langage de programmation Java. Les méthodes d’initialisation de classe et d’interface sont invoquées implicitement par la machine virtuelle Java; ils ne sont jamais invoqués directement depuis une machine virtuelle Java inw2struction, mais ne sont invoqués qu’indirectement dans le cadre du processus d’initialisation de la classe.

est le (ou l’un des) constructeur (s) de l’instance et une initialisation de champ non statique.

sont les blocs d’initialisation statiques pour la classe et l’initialisation du champ statique.

 class X { static Log log = LogFactory.getLog(); //  private int x = 1; //  X(){ //  } static { //  } } 

désigne un constructeur, désigne un initialiseur statique : “Blocs d’initialisation statique” dans le didacticiel Java , initialiseur statique en Java .

La différence entre et est que est utilisé pour les méthodes de constructeur qui initialisent une instance d’object, tandis que est utilisé pour initialiser l’object de classe lui-même. Par exemple, l’initialisation de tous static champs static au niveau de la classe est effectuée dans lorsque la classe est chargée et initiée.

Juste pour append Si vous utilisez la méthode Class.forName, elle n’initialise que la classe. Donc, à partir de cette méthode, il appelle uniquement clinit et lorsque vous utilisez newInstance sur l’object renvoyé par forName, il appelle init pour l’initialisation de l’instance. Vous pouvez utiliser le code ci-dessous pour le voir en débogage.

 public class ByteCodeParent { public static Ssortingng name="ByteCode"; public ByteCodeParent() { System.out.println("In Constructor"); } static { System.out.println("In Static"); } { System.out.println("In Instance"); } 

Pour tester, utilisez

  Class bcp2 =(Class) Class.forName("ByteCodeParent"); ByteCodeParent bcp4= bcp2.newInstance();