Heim  >  Artikel  >  Java  >  In welcher Reihenfolge werden Codeblöcke und Konstruktoren während der Java-Objektinitialisierung aufgerufen?

In welcher Reihenfolge werden Codeblöcke und Konstruktoren während der Java-Objektinitialisierung aufgerufen?

王林
王林nach vorne
2023-05-10 09:52:081080Durchsuche

    Prioritätsreihenfolge beim Laden des Codes

    Statischer Codeblock, statische Mitgliedsvariable -> nicht statischer Codeblock, nicht statische Mitgliedsvariable -> neue andere Objekte rufen die entsprechende Objektkonstruktionsmethode auf (außerhalb der lokalen Methode). Objekt einschließlich Konstruktor) -> neues lokales Objekt ruft den Konstruktor auf.

    Hinweis: Wenn ein neues Objekt vorhanden ist, gibt es statische Codeblöcke und nicht statische Codeblöcke im Objekt. Jedes Mal, wenn das Objekt neu ist, wird der nicht statische Codeblock einmal ausgeführt, der statische jedoch Der Codeblock wird nur einmal ausgeführt und dann wird das neue Objekt nicht erneut ausgeführt. 】

    Ausführungsreihenfolge der Konstruktormethoden

    Statischer Codeblock der übergeordneten Klasse (statische Variable > statischer Block) > Statischer Codeblock der übergeordneten Klasse > Konstruktionscodeblock der Unterklasse

    Definition verschiedener Codeblöcke

    Statischer Codeblock

    class Demo{ static { //静态代码块...... } }

    Eigenschaften: 1. Der Code im statischen Java-Codeblock wird ausgeführt, wenn die Klasse die JVM lädt, und nur einmal ausgeführt. 2. Statische Blöcke werden häufig zur Initialisierung der Ausführung verwendet von Klassenattributen und einige globale Initialisierungsarbeiten. 3. Statische Blöcke haben Vorrang vor verschiedenen Codeblöcken und Konstruktoren. Wenn eine Klasse mehrere statische Codeblöcke enthält, werden diese nacheinander in der Reihenfolge des Schreibens ausgeführt. 4. Statische Codeblöcke können irgendwo in der Klasse definiert werden, außer im Methodenkörper [der Methodenkörper hier ist ein beliebiger Methodenkörper] 5. Statische Codeblöcke können nicht auf gewöhnliche Variablen zugreifen

    Die statischen Codeblöcke werden im Detail vorgestellt

    Statische Codeblöcke: Verwenden Sie statische Codeblöcke im Java-Codeblock zur Schlüsselwortdeklaration. Statische Blöcke werden verwendet, um Klassen und Eigenschaften der Klasse zu initialisieren. Jeder statische Codeblock wird nur einmal ausgeführt.

    Da die JVM beim Laden der Klasse den statischen Codeblock ausführt, wird der statische Codeblock vor der Hauptmethode ausgeführt. Wenn die Klasse mehrere statische Codeblöcke enthält, wird zuerst der zuerst definierte Code und dann der später definierte Code ausgeführt. [Hinweis: 1 Statische Codeblöcke können in keinem Methodenkörper vorhanden sein. 2 Statische Codeblöcke können nicht direkt auf statische Instanzvariablen und Instanzmethoden zugreifen. Sie müssen über das Instanzobjekt der Klasse aufgerufen werden. 】 Instanzcodeblock Der Instanzcodeblock wird auch als Konstruktionsinitialisierungsblock, Konstruktionscodeblock und Initialisierungsblock bezeichnet.

    class Demo{ { //实例代码块...... } }

    Eigenschaften:

    • 1. Der Konstruktionscodeblock wird beim Erstellen eines Objekts aufgerufen, und er wird jedes Mal aufgerufen, wenn ein Objekt erstellt wird.

    • 2 Der Konstruktionscodeblock hat Vorrang vor dem Die Ausführung der Konstruktorfunktion und gleichzeitig die Ausführung des Konstruktionscodeblocks hängen vom Konstruktor ab namens gewöhnlicher Codeblock, Methodencodeblock

      class Demo{ public void test(){ { //局部代码块...... } } }
    • Eigenschaften: 1. Gewöhnlich Der Codeblock ist im Methodenkörper definiert 2. Das Format des gewöhnlichen Codeblocks und des Instanzcodeblocks ist das gleiche wie {} 3. Das einzige Der direkt sichtbare Unterschied zwischen dem gewöhnlichen Codeblock und dem konstruierten Codeblock besteht darin, dass der konstruierte Codeblock in der Klasse 4 definiert ist. Der Variablenlebenszyklus kann begrenzt, frühzeitig freigegeben und verbessert werden Speicherauslastung. Überprüfen Sie die Ausführungsreihenfolge jedes Codeblocks. Der Beispielcode lautet wie folgt:

      class Init {
          public Init() {
              System.out.println("无参构造器");
          }
          public Init(int a) {
              System.out.println("有参构造器");
          }
          {
              System.out.println("实例代码块1");
          }
          {
              System.out.println("实例代码块2");
          }
          {
              System.out.println("实例代码块3");
          }
          static {
              System.out.println("静态初始化块1");
          }
       
          static {
              System.out.println("静态初始化块2");
          }
      
          public void method(){
          	{
          		System.out.println("普通初始化块");
          	}
          }
      }

      Die laufenden Ergebnisse sind wie folgt:

    Fazit:

    Die Ausführungsreihenfolge lautet: statischer Codeblock> Instanzcodeblock> gewöhnlicher Codeblock,

    Und der statische Codeblock wird nur einmal aufgerufen (als Klasse ausgeführt). geladen wird).

    Wann wird die Klasse geladen?

    - Beim Erstellen einer Objektinstanz (neu) - Beim Erstellen einer Unterklassen-Objektinstanz wird auch die übergeordnete Klasse geladen

    - Bei Verwendung statischer Mitglieder der Klasse (statische Eigenschaften, statische Methoden)

    Überprüfen Sie die Existenz von Jeder Codeblock in der Vererbungsbeziehung. Die Vererbungsbeziehung ist beispielsweise

    Drei—> Zwei——> Eins. Der Code lautet wie folgt:

    In welcher Reihenfolge werden Codeblöcke und Konstruktoren während der Java-Objektinitialisierung aufgerufen?

    class Demo {
        public static void main(String[] args) {
            Init init1 = new Init();
            init1.method();
            System.out.println("------------");
            Init init2 = new Init();
            init2.method();
            //多打印几个对象的目的是:方便看出Static静态代码块 是否只执行一次!!!
            System.out.println("------------");
            Init init3 = new Init();
            init3.method();
        }
    }

    Anhand der Ausführungsergebnisse ist ersichtlich, dass es bei der Vererbung mehrerer Klassen Initialisierungsblöcke, statische Initialisierungsblöcke und Konstruktoren gibt. Die tatsächliche Ausführungsreihenfolge lautet: Führen Sie die statischen Blöcke der übergeordneten Klasse A und die statischen Blöcke aus Die übergeordnete Klasse B und schließlich die statischen Blöcke der Unterklasse führen dann die Instanzcodeblöcke der übergeordneten Klasse A und den Konstruktor aus, dann den Instanzcodeblock und den Konstruktor der Klasse B und schließlich den Instanzcodeblock und den Konstruktor der Unterklasse C [Hinweis: ABC entspricht hier Eins, Zwei, Drei]

    Schlussfolgerung:

    Die Ausführungsreihenfolge von Initialisierungsblöcken, statischen Initialisierungsblöcken und Konstruktoren bei der Vererbung mehrerer Klassen ist:

    父类静态块——>子类静态块——>父类实例代码块——>父类构造器——>子类实例代码块——>子类构造器 ——>(如果有局部代码块, 再正常执行即可, 这里就没必要进行测试了)

    通过字节码深究实例代码块优先于构造器原因

    我们那一段代码作为例子说明下,代码如下:

    class Init {
        public Init() {
            System.out.println("无参构造器");
        }
        public Init(int a) {
            System.out.println("有参构造器");
     
        }
     
        {
            System.out.println("实例代码块1");
        }
     
        {
            System.out.println("实例代码块2");
        }
     
        {
            System.out.println("实例代码块3");
        }
     
        static {
            System.out.println("静态初始化块1");
        }
     
        static {
            System.out.println("静态初始化块2");
        }
     
        public void method(){
            {
                System.out.println("普通初始化块");
            }
        }
    }

    接下来让我们看看 , Init.java编译完的的字节码文件(Init.class)

    In welcher Reihenfolge werden Codeblöcke und Konstruktoren während der Java-Objektinitialisierung aufgerufen?

    从这个字节码文件就可以很清晰的看出, 实例代码块实际上是被依次放到了构造方法的第一句, 所以可以的出此结论: 实例代码块的执行顺序是优先于构造器的。

    Das obige ist der detaillierte Inhalt vonIn welcher Reihenfolge werden Codeblöcke und Konstruktoren während der Java-Objektinitialisierung aufgerufen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

    Stellungnahme:
    Dieser Artikel ist reproduziert unter:yisu.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen