112 votes

Java : Quelle est la différence entre <init> et <clinit> ?

Je n'arrive pas à comprendre le texte suivant... Cela signifie-t-il que <clinit> 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 qui a le nom spécial <init> . Ce nom est fourni par un compilateur. Parce que le nom <init> n'est pas un identificateur valide, il ne peut pas être utilisé directement dans une programme écrit dans le langage de programmation Java. Instance ne peuvent être invoquées qu'au sein de la machine virtuelle Java par l'instruction invokespecial. par l'instruction invokespecial, et elles ne peuvent être invoquées que sur des instances de classe non initialisées. 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. elle a été 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. méthode. La méthode d'initialisation d'une classe ou d'une interface est statique et ne prend aucun argument. Elle porte le nom spécial <clinit> . Ce nom est fourni par un compilateur. Parce que le nom <clinit> n'est pas un identifiant valide, il ne peut pas être utilisé directement dans un programme écrit en langage langage de programmation Java. Les méthodes d'initialisation des classes et des interfaces sont invoquées implicitement par la machine virtuelle Java ; elles ne sont jamais jamais invoquées directement à partir d'une inw2struction de la machine virtuelle Java. mais ne sont invoquées qu'indirectement dans le cadre du processus d'initialisation de la classe.

173voto

Thilo Points 108673

<init> est le (ou l'un des) constructeur(s) de l'instance, et l'initialisation des champs non statiques.

<clinit> sont les blocs d'initialisation statiques de la classe, et l'initialisation statique des champs.

class X {

   static Log log = LogFactory.getLog(); // <clinit>

   private int x = 1;   // <init>

   X(){
      // <init>
   }

   static {
      // <clinit>
   }

}

22voto

Eli Acherkan Points 3957

<init> désigne un constructeur, <clinit> désigne un initialisation statique : "Blocs d'initialisation statique" dans le tutoriel Java , Initialisateur statique en Java .

14voto

rsp Points 14367

La différence entre <init> y <clinit> c'est que <init> est utilisée pour les méthodes de construction qui initialisent une instance d'objet, tandis que la fonction <clinit> est utilisé pour initialiser l'objet classe lui-même. Par exemple, l'initialisation d'un objet static Les champs de niveau classe sont effectués dans <clinit> lorsque la classe est chargée et initialisée.

1voto

Piyush Arora Points 11

Juste pour ajouter Si vous utilisez la méthode Class.forName, elle ne fait qu'initialiser la classe. Ainsi, à l'intérieur de cette méthode, elle fait un appel uniquement à clinit et lorsque vous utilisez newInstance sur l'objet renvoyé par forName, elle 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 String name="ByteCode";
 public ByteCodeParent()
{
    System.out.println("In Constructor");
}

 static
 {
     System.out.println("In Static");
 }

 {
     System.out.println("In Instance");
 }

Pour tester, utilisez

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X