Heim >Java >javaLernprogramm >Geben Sie ein Beispiel für die Ausführungsreihenfolge von Codeblöcken in Java

Geben Sie ein Beispiel für die Ausführungsreihenfolge von Codeblöcken in Java

高洛峰
高洛峰Original
2017-01-18 15:08:131319Durchsuche

Vorwort
Als ich mir heute die Implementierung von Android ContentProvider ansah, dachte ich plötzlich an die Ausführungsreihenfolge von statischen Domänen, statischen Blöcken, nicht statischen Domänen, nicht statischen Blöcken und Konstruktoren in der Java-Klasse der neue Prozess. Tatsächlich ist dies eine sehr klassische Frage, die die Beherrschung grundlegender Java-Kenntnisse auf die Probe stellt. Ich glaube, dass es während des Vorstellungsgesprächs viele solcher Fragen gibt, also nutzen Sie die Zeit am Wochenende, um sie noch einmal durchzugehen.

Schlussfolgerung
Hier werde ich Ihnen zuerst die zusammengestellte Schlussfolgerung geben und dann ein Programm schreiben, um unsere Schlussfolgerung zu überprüfen. Wenn eine Java-Klasse neu ist, ist die Ausführungssequenz wie folgt:

Implementieren Sie ihre eigenen statischen Attribute und statischen Codeblöcke. (Bestimmen Sie anhand der Reihenfolge, in der der Code angezeigt wird, wer zuerst ausgeführt wird.)

Implementieren Sie Ihre eigenen nicht statischen Attribute und nicht statischen Codeblöcke.

Eigenen Konstruktor ausführen.

Im Prozess der Implementierung der geerbten Klasse als neu ist die Initialisierungsausführungssequenz wie folgt:

Implementieren Sie die öffentlichen statischen Eigenschaften und den statischen Code auf Blockebene der übergeordneten Klasse.

Implementieren Sie Ihre eigenen statischen Eigenschaften und statischen Code auf Blockebene.

Implementieren Sie die nicht statischen Eigenschaften und nicht statischen Codeblöcke der übergeordneten Klasse.

Führen Sie den Konstruktor der übergeordneten Klasse aus.

Implementieren Sie Ihre eigenen nicht statischen Eigenschaften und nicht statischen Codeblöcke.

Eigenen Konstruktor ausführen.

Hier müssen wir kurz statische Codeblöcke und nicht statische Codeblöcke vorstellen.
1. Statischer Codeblock:

statisch {
}

2. Nicht statischer Codeblock

{
}

Die Ähnlichkeiten und Unterschiede zwischen statischen Codeblöcken und nicht statischen Codeblöcken sind wie folgt:

Ähnlichkeiten: Sie werden beide ausgeführt, wenn die JVM die Klasse lädt und bevor der Konstruktor ausgeführt werden kann werden in der Klasse definiert, normalerweise in Einigen statischen Variablen werden im Codeblock Werte zugewiesen.

Unterschied: Statische Codeblöcke werden vor nicht statischen Codeblöcken ausgeführt (statische Codeblöcke > nicht statische Codeblöcke). Der statische Codeblock wird nur einmal ausgeführt, wenn er zum ersten Mal neu ist, und wird danach nicht mehr ausgeführt. Nicht statische Codeblöcke werden jedes Mal ausgeführt, wenn sie neu sind.


Überprüfung
Die beste Überprüfung der Schlussfolgerung besteht darin, den Code zu schreiben, um die Ergebnisse zu beweisen. Schauen wir uns zunächst die Ausführungssequenz beim Initialisieren einer Klasse ohne Vererbung an. Der Code lautet wie folgt:

public class InitOderTest { 
  public static String STATIC_FIELD = "静态属性"; 
    
  // 静态块 
  static { 
    System.out.println(STATIC_FIELD); 
    System.out.println("静态代码块"); 
  } 
    
  public String field = "非静态属性"; 
    
  // 非静态块 
  { 
    System.out.println(field); 
    System.out.println("非静态代码块"); 
  } 
  
  public InitOderTest() { 
    System.out.println("无参构造函数"); 
  } 
    
  public static void main(String[] args) { 
    InitOderTest test = new InitOderTest(); 
  } 
}

Ausführungsergebnisse:

Statische Eigenschaften

Statischer Codeblock

Nicht-statische Eigenschaften

Nicht-statischer Codeblock

Konstruktor ohne Argumente

Als nächstes überprüfen wir, ob die Java Klasse implementiert Vererbung, führt aus. Stimmt die Sequenz mit unseren Schlussfolgerungen überein? Der Testcode lautet wie folgt:

class ParentTest { 
   public static String PARENT_STATIC_FIELD = "父类-静态属性"; 
   
   // 父类-静态块 
   static { 
     System.out.println(PARENT_STATIC_FIELD); 
     System.out.println("父类-静态代码块"); 
   } 
   
   public static String parentField = "父类-非静态属性"; 
   
   // 父类-非静态块 
   { 
     System.out.println(parentField); 
     System.out.println("父类-非静态代码块"); 
   } 
   
   public ParentTest() { 
     System.out.println("父类—无参构造函数"); 
   } 
 } 
   
 public class InitOderTest extends ParentTest { 
   public static String STATIC_FIELD = "静态属性"; 
   
   // 静态块 
   static { 
     System.out.println(STATIC_FIELD); 
     System.out.println("静态代码块"); 
   } 
   
   public String field = "非静态属性"; 
   
   // 非静态块 
   { 
     System.out.println(field); 
     System.out.println("非静态代码块"); 
   } 
   
   public InitOderTest() { 
     System.out.println("无参构造函数"); 
   } 
   
   public static void main(String[] args) { 
     InitOderTest test = new InitOderTest(); 
   } 
 }

Die Ausführungsergebnisse lauten wie folgt:

Übergeordnete Klasse – statische Eigenschaften

Übergeordnete Klasse – statischer Codeblock

Statische Eigenschaften

Statischer Codeblock

Übergeordnete Klasse – nicht statische Eigenschaften

Übergeordnete Klasse – nicht statischer Codeblock

Übergeordnete Klassen-Nr -Argument-Konstruktor

Nicht-statische Eigenschaften

Nicht-statische Codeblöcke

Kein-Argument-Konstruktor

Weitere Beispiele für die Ausführungsreihenfolge von Codeblöcken In Java beachten Sie bitte die PHP-Chinese-Website für verwandte Artikel!


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