Heim  >  Artikel  >  Java  >  Analyse der Ladereihenfolge von Klassen in Java (häufig in Interviewfragen verwendet)

Analyse der Ladereihenfolge von Klassen in Java (häufig in Interviewfragen verwendet)

高洛峰
高洛峰Original
2017-01-13 09:24:451372Durchsuche

Dies ist eigentlich eine schriftliche Testfrage von Alibaba, die mir letztes Jahr bei der Rekrutierung von Schulen begegnet ist (ich gebe zu, sie ist etwas alt -.-). Nun, wenn ich mich richtig erinnere, war es eine optionale Hauptfrage in Richtung Java. Natürlich ist die Bedeutung der Frage nicht so einfach. Die Frage erfordert lediglich, dass Sie die Ausgabeergebnisse aller System.out.println schreiben, nachdem das Programm ausgeführt wurde, und die unterschiedliche Ausführungsreihenfolge Jedes System.out.println führt zur endgültigen Programmausgabe. Die Ergebnisse sind ebenfalls unterschiedlich.

Ich kann mich definitiv nicht an die spezifische Frage erinnern, aber wir können die Frage direkt ändern, wenn es in Klasse A statische Variablen, statische Anweisungsblöcke, nicht statische Variablen, nicht statische Anweisungsblöcke und Konstruktoren gibt und Klasse B, statische Methode, nicht statische Methode, und Klasse A erbt Klasse B. Wie ist die Ladereihenfolge innerhalb der Klasse beim Instanziieren von A?

Ich war damals auch verwirrt und habe eine geschrieben Nach einer kleinen Demo kenne ich nun die tatsächliche Ladesequenz innerhalb der Klasse:

Klasse B:

public class B{
//静态变量  
static int i=1;
//静态语句块
static {
    System.out.println("Class B1:static blocks"+i);
}
//非静态变量
int j=1;
//静态语句块
static{
    i++;
    System.out.println("Class B2:static blocks"+i);
}
//构造函数
public B(){
    i++;
    j++;
    System.out.println("constructor B: "+"i="+i+",j="+j);
}
//非静态语句块
{
  i++;
  j++;
  System.out.println("Class B:common blocks"+"i="+i+",j="+j);
}
//非静态方法
public void bDisplay(){
    i++;
    System.out.println("Class B:static void bDisplay(): "+"i="+i+",j="+j);
    return ;
}
//静态方法
public static void bTest(){
    i++;
    System.out.println("Class B:static void bTest():    "+"i="+i);
    return ;
}
}

Klasse A:

public class A extends B{
//静态变量  
static int i=1;
//静态语句块
static {
    System.out.println("Class A1:static blocks"+i);
}
//非静态变量
int j=1;
//静态语句块
static{
    i++;
    System.out.println("Class A2:static blocks"+i);
}
//构造函数
public A(){
    super();
    i++;
    j++;
    System.out.println("constructor A: "+"i="+i+",j="+j);
}
//非静态语句块
{
  i++;
  j++;
  System.out.println("Class A:common blocks"+"i="+i+",j="+j);
}
//非静态方法
public void aDisplay(){
    i++;
    System.out.println("Class A:static void aDisplay(): "+"i="+i+",j="+j);
    return ;
}
//静态方法
public static void aTest(){
    i++;
    System.out.println("Class A:static void aTest():    "+"i="+i);
    return ;
}
}

Class ClassLoading:

public class ClassLoading {
     
    public static void main (String args[]) {
        A a=new A();
        a.aDisplay();
    }
}

Das Ergebnis der Programmausführung ist wie in der Abbildung dargestellt:

Analyse der Ladereihenfolge von Klassen in Java (häufig in Interviewfragen verwendet)

Durch das obige Diagramm haben wir Sie können den gesamten Ladevorgang der Java-Klasse deutlich sehen.

1. Wenn Sie Klasse A laden möchten, laden Sie zuerst die statischen Variablen und statischen Anweisungsblöcke ihrer übergeordneten Klasse B (Objekt) (die Ausführungsreihenfolge entspricht der Reihenfolge der Anordnung).
2. Laden Sie dann die statischen Variablen und statischen Anweisungsblöcke der Ausführungsklasse A. (Und die Schritte 1 und 2 werden nur einmal ausgeführt)
3. Wenn Sie Klasse A instanziieren müssen, rufen Sie zuerst den Konstruktor ihrer übergeordneten Klasse B auf, und bevor Sie den Konstruktor ihrer übergeordneten Klasse B aufrufen, rufen Sie die Nicht-Klasse auf. statische Variablen und nicht statische Anweisungsblöcke in der übergeordneten Klasse B. Rufen Sie abschließend den Konstruktor in der übergeordneten Klasse B zur Initialisierung auf.
4. Rufen Sie dann nacheinander die nicht statischen Variablen und nicht statischen Anweisungsblöcke in Klasse A auf. Rufen Sie schließlich den Konstruktor in A zur Initialisierung auf. (Und die Schritte 3 und 4 können wiederholt werden)
5. Statische Methoden und nicht statische Methoden sind beide passive Aufrufe, das heißt, das System ruft sie nicht automatisch auf und führt sie aus, sodass sie nicht ausgeführt werden, wenn der Benutzer dies tut Der Hauptunterschied besteht darin, dass statische Methoden direkt über den Klassennamen (oder instanziierte Objekte) aufgerufen werden können, während nicht statische Methoden erst aufgerufen werden können, nachdem das Objekt instanziiert wurde.

OK, das ist die Zusammenfassung für heute. Wenn es etwas gibt, das nicht gut oder falsch ist, können Sie es gerne darauf hinweisen und ich werde es korrigieren.

Weitere verwandte Artikel zur Ladereihenfolgeanalyse von Klassen in Java (häufig in Interviewfragen verwendet) finden Sie auf der chinesischen PHP-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