Java 語言中的實例初始化塊 ( IIB) 詳解

Java 語言中的類初始化塊 文章中咱們簡單的介紹了下 Java 中的實例初始化塊 ( IIB )。不過我以爲介紹的有點簡單了,因而,再寫一篇文章詳細介紹下吧。html

Java 語言中,存在三種操做:方法構造函數 和初始化塊。java

其中初始化塊又分爲 **實例初始化塊 ( IIB ) **和 靜態初始化塊。本章節,咱們主要介紹實例初始化塊。函數

實例初始化塊 用於初始化實例變量。code

實例初始化塊 會在初始化類的一個實例時執行,並且在構造函數以前就執行。而且每次建立類的對象時它們都會執行。htm

實例化塊的語法

實例初始化塊通常放在構造函數以前,使用大括號 {} 擴起來的代碼。語法結構通常以下對象

class JavaTester 
{ 
    // 實例化塊 
    {  
        System.out.println("IIB block"); 
    } 
     
    // 構造函數
    JavaTester() 
    { 
        System.out.println("Constructor Called"); 
    } 
    public static void main(String[] args) 
    { 
        JavaTester a = new JavaTester(); 
    } 
}

注意,實例化塊並非類的必須。只是一個可選項。用於抽出構造函數的公共部分單獨執行而已。繼承

這段代碼是能夠編譯運行的,運行結果以下教程

[yufei@www.twle.cn java]$ javac JavaTester.java && java JavaTester
IIB block
Constructor Called

一個類中包含多個實例初始化塊

類中的 實例初始化塊 並非類所必須的,並且,不限數量。一個類既能夠沒有實例初始化塊,也能夠有多個實例初始化塊。get

若是一個類有多個實例初始化塊,那麼它們會按照順序從上到下依次執行,也就是說,定義在類頂部的實例初始化塊最早執行。編譯器

咱們來看一段代碼,下面的類 JavaTester 定義了多個實例初始化塊。

class JavaTester 
{ 
    {  
        System.out.println("IIB1 block 1 "); 
    } 
    
    { 
        System.out.println("IIB2 block 2"); 
    } 
       
    JavaTester() 
    { 
        System.out.println("Constructor Called"); 
    } 
      
    { 
        System.out.println("IIB3 block 3"); 
    } 
     
    public static void main(String[] args) 
    { 
        JavaTester a = new JavaTester(); 
    } 
}

運行上面這段代碼,輸出結果以下

[yufei@www.twle.cn java]$ javac JavaTester.java && java JavaTester
IIB1 block 1 
IIB2 block 2
IIB3 block 3
Constructor Called

父類中的初始化塊

在 Java 語言的繼承體系中,父類一樣能夠有初始化塊,並且數量不限。

父類的實例初始化塊在子類的構造函數中調用 super() 以後當即運行。編譯器會在執行當前類的實例初始化塊以前先執行父類的實例初始化塊。

是否是很繞口,咱們寫一段代碼來演示下

class B 
{ 
    B() 
    { 
        System.out.println("B-Constructor Called"); 
    } 
  
    { 
        System.out.println("B-IIB block"); 
    } 
  
}

public class JavaTester extends B 
{ 
    {  
        System.out.println("JavaTester IIB1 block 1 "); 
    } 
    
    { 
        System.out.println("JavaTester IIB2 block 2"); 
    } 
       
    JavaTester() 
    { 
        super(); 
        System.out.println("JavaTester-Constructor Called");
    } 
      
    { 
        System.out.println("JavaTester IIB3 block 3"); 
    } 
     
    public static void main(String[] args) 
    { 
        JavaTester a = new JavaTester(); 
    } 
}

運行以上範例,輸出結果以下

[yufei@www.twle.cn java]$ javac JavaTester.java && java JavaTester
B-IIB block
B-Constructor Called
JavaTester IIB1 block 1 
JavaTester IIB2 block 2
JavaTester IIB3 block 3
JavaTester-Constructor Called

從運行的結果來看,當建立類 JavaTester 的對象時,編譯器嘗試執行類 JavaTester 的構造函數。但由於它有一個父類,在發現了 super() 語句後,就轉而先執行父類的構造函數。

所以,在繼承體系中,實例初始化塊和構造函數的執行順序以下

  1. 執行父類的實例初始化塊
  2. 執行父類的構造函數
  3. 執行當前類的實例初始化塊
  4. 執行當前類的構造函數

實例初始化塊的要點

咱們一塊兒來回顧下實例初始化塊的要點。

  • 每次建立新實例時都會運行實例初始化塊
  • 初始化塊按它們在類中出現的順序運行
  • 若是存在父類,則首先會實例化父類而後在調用當前類的實例初始化塊,最後再調用當前類的構造函數。

聲明:本文首發 簡單教程,網址爲 https://www.twle.cn/t/454#reply0

相關文章
相關標籤/搜索