Heim >Java >javaLernprogramm >Eine kurze Diskussion über den Initialisierungsprozess jeder Mitgliedsvariablen in Java

Eine kurze Diskussion über den Initialisierungsprozess jeder Mitgliedsvariablen in Java

无忌哥哥
无忌哥哥Original
2018-07-19 11:48:581691Durchsuche

Vorwort

Vor kurzem habe ich Denken in Java gelesen und habe nie auf die Initialisierung jedes Mitglieds in der Klasse I geachtet Ich werde es hier aufzeichnen und wenn es Fehler gibt, korrigieren Sie mich bitte:

1 Vererbung und Initialisierung

Verstehen Sie den gesamten Initialisierungsprozess einschließlich der Vererbung um einen globalen Überblick über alles zu haben, was passiert. Das Verständnis ist sehr vorteilhaft.

In Java existiert der kompilierte Code jeder Klasse in einer eigenen unabhängigen Datei (d. h. Klassendatei), die nur geladen wird, wenn der Programmcode benötigt wird. Im Allgemeinen wird „der Code der Klasse geladen, wenn er zum ersten Mal verwendet wird“, was normalerweise die folgenden zwei Situationen umfasst:

  1. Wenn das erste Objekt der Klasse erstellt wird

  2. Beim Zugriff auf statische Methoden oder Felder

Hinweis: Wenn eine Klasse zum ersten Mal verwendet wird, findet hier auch die statische Initialisierung statt. Alle Objekte und Codes werden in der Reihenfolge initialisiert, in der sie geschrieben werden. Als statisch definierte Felder werden nur einmal initialisiert.

Ohne weitere Umschweife lauten die Details wie folgt:

public class Base {
    //static字段
    private static int I1 = printInt("Init I1");    //普通字段
    private int i = 11;    
    protected int j;    
    public Base(){
        System.out.println("Base constructor");
        System.out.println("i="+i+" j="+j);
        j = 40;
    }    static int printInt(String str) {
        System.out.println(str);        
        return 10;
    }
}
public class Son extends Base{
    private static int I2 = printInt("Init I2");    
    public Son() {
        System.out.println("Son constructor");
        System.out.println("I2="+I2+" j= "+j);
    }    
    public static void main(String[] args) {
        Son son = new Son();
    }
}

Was ist Ihrer Meinung nach die Ausgabe, nachdem Sie diesen Code gelesen haben?

Geben Sie zuerst die Antwort und analysieren Sie dann:

Init I1
Init I2
Base constructori=11 j=0Son constructorI2=10 j= 40

Analyse:

Das Programm startet zuerst mit der Hauptmethode der Son-Klasse, sodass der Loader startet und Finden Sie den Son-Kompilierungscode (d. h. die Klassendatei) heraus. Während des Ladevorgangs haben wir festgestellt, dass Son auch eine übergeordnete Klasse Base hat. Daher laden wir weiterhin den kompilierten Code von Base (wenn Base noch eine übergeordnete Klasse hat, fahren wir mit der Ausführung nach oben fort, dem statischen Feld der Stammbasis). Die Klasse wird initialisiert, da die Unterklasse möglicherweise von der Basisklasse abhängt. Ob die Mitglieder korrekt initialisiert werden können, sodass Init I1 auftritt, und dann zu Son übergehen, wird das statische Feld der Son-Klasse initialisiert, sodass Init I2 auftritt An diesem Punkt sind alle notwendigen Klassen geladen und die Initialisierung des Objekts kann beginnen. Wenn wir die Codezeile Son son = new Son() sehen, können wir den Konstruktor von Son aufrufen. Wir wissen, dass in der Vererbungsbeziehung super() im Konstruktor der Unterklasse aufgerufen wird. Dies führt zur Rückkehr zur übergeordneten Klasse, aber bevor der Konstruktor abgeschlossen ist, schließen alle gewöhnlichen Felder (d. h. nicht statische Felder) in der übergeordneten Klasse (Basis) ihre eigene Initialisierung ab, sodass Sie die Ausgabe i=11 j=0 sehen und dann kommen Für die Unterklasse (Son) ist der Ausführungsprozess derselbe wie für die übergeordnete Klasse. Schließen Sie zunächst die Initialisierung gewöhnlicher Felder ab und rufen Sie dann die Konstruktormethode auf.

Viel gesagt, der Gesamtprozess ist wie folgt:

  1. Beginnen Sie mit dem Programmeintrag und laden Sie die Klasse (hier als Z-Klasse festgelegt). ), Wenn eine Vererbungsbeziehung besteht, führen Sie eine Rekursion nach oben bis zur Stammklasse durch (hier wird Klasse A angenommen).

  2. Schließen Sie die statische Feldinitialisierung der Klasse A ab und rekursieren Sie nach unten, bis Sie auf Klasse Z stoßen.

  3. Schließen Sie die allgemeine Domäneninitialisierung von Klasse A ab, vervollständigen Sie den Konstruktor von Klasse A und rekursieren Sie abwärts, bis Klasse Z angetroffen wird.

Das obige ist der detaillierte Inhalt vonEine kurze Diskussion über den Initialisierungsprozess jeder Mitgliedsvariablen in Java. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn