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

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

Jan 13, 2017 am 09:24 AM

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 ;
}
}
Nach dem Login kopieren

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 ;
}
}
Nach dem Login kopieren

Class ClassLoading:

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

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!

Erklärung dieser Website
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

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

AI Hentai Generator

AI Hentai Generator

Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

R.E.P.O. Energiekristalle erklärten und was sie tun (gelber Kristall)
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Beste grafische Einstellungen
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. So reparieren Sie Audio, wenn Sie niemanden hören können
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Wie man alles in Myrise freischaltet
1 Monate vor By 尊渡假赌尊渡假赌尊渡假赌

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Wie funktioniert der Klassenladungsmechanismus von Java, einschließlich verschiedener Klassenloader und deren Delegationsmodelle? Wie funktioniert der Klassenladungsmechanismus von Java, einschließlich verschiedener Klassenloader und deren Delegationsmodelle? Mar 17, 2025 pm 05:35 PM

Mit der Klassenbelastung von Java wird das Laden, Verknüpfen und Initialisieren von Klassen mithilfe eines hierarchischen Systems mit Bootstrap-, Erweiterungs- und Anwendungsklassenloadern umfasst. Das übergeordnete Delegationsmodell stellt sicher

Wie implementiere ich mehrstufige Caching in Java-Anwendungen mit Bibliotheken wie Koffein oder Guava-Cache? Wie implementiere ich mehrstufige Caching in Java-Anwendungen mit Bibliotheken wie Koffein oder Guava-Cache? Mar 17, 2025 pm 05:44 PM

In dem Artikel wird in der Implementierung von mehrstufigem Caching in Java mithilfe von Koffein- und Guava-Cache zur Verbesserung der Anwendungsleistung erläutert. Es deckt die Einrichtungs-, Integrations- und Leistungsvorteile sowie die Bestrafung des Konfigurations- und Räumungsrichtlinienmanagements ab

Wie kann ich JPA (Java Persistence-API) für Objektrelationszuordnungen mit erweiterten Funktionen wie Caching und faulen Laden verwenden? Wie kann ich JPA (Java Persistence-API) für Objektrelationszuordnungen mit erweiterten Funktionen wie Caching und faulen Laden verwenden? Mar 17, 2025 pm 05:43 PM

In dem Artikel werden mit JPA für Objektrelationszuordnungen mit erweiterten Funktionen wie Caching und faulen Laden erläutert. Es deckt Setup, Entity -Mapping und Best Practices zur Optimierung der Leistung ab und hebt potenzielle Fallstricke hervor. [159 Charaktere]

Wie benutze ich Maven oder Gradle für das fortschrittliche Java -Projektmanagement, die Erstellung von Automatisierung und Abhängigkeitslösung? Wie benutze ich Maven oder Gradle für das fortschrittliche Java -Projektmanagement, die Erstellung von Automatisierung und Abhängigkeitslösung? Mar 17, 2025 pm 05:46 PM

In dem Artikel werden Maven und Gradle für Java -Projektmanagement, Aufbau von Automatisierung und Abhängigkeitslösung erörtert, die ihre Ansätze und Optimierungsstrategien vergleichen.

Wie erstelle und verwende ich benutzerdefinierte Java -Bibliotheken (JAR -Dateien) mit ordnungsgemäßem Versioning und Abhängigkeitsmanagement? Wie erstelle und verwende ich benutzerdefinierte Java -Bibliotheken (JAR -Dateien) mit ordnungsgemäßem Versioning und Abhängigkeitsmanagement? Mar 17, 2025 pm 05:45 PM

In dem Artikel werden benutzerdefinierte Java -Bibliotheken (JAR -Dateien) mit ordnungsgemäßem Versioning- und Abhängigkeitsmanagement erstellt und verwendet, wobei Tools wie Maven und Gradle verwendet werden.

See all articles