首頁  >  文章  >  Java  >  Java中的實例初始化區塊 ( IIB)的詳細介紹(程式碼範例)

Java中的實例初始化區塊 ( IIB)的詳細介紹(程式碼範例)

不言
不言轉載
2018-10-15 15:41:062160瀏覽

這篇文章帶給大家的內容是關於Java中的實例初始化區塊( IIB)的詳細介紹(程式碼範例),有一定的參考價值,有需要的朋友可以參考一下,希望對你有所幫助。

在 Java 語言中的類別初始化區塊 文章中我們簡單的介紹了下 Java 中的實例初始化區塊 ( IIB )。不過我覺得介紹的有點簡單了,於是,再寫一篇文章詳細介紹下。

Java 語言中,有三種操作:方法 、建構子 和 初始化區塊。

其中初始化區塊又分為 實例初始化區塊 ( IIB ) 和 靜態初始化區塊。本章節,我們主要介紹實例初始化區塊。

實例初始化區塊 用於初始化實例變數。

實例初始化區塊 會在初始化類別的一個實例時執行,而且在建構子之前就執行。並且每次創建類別的物件時它們都會執行。

實例化區塊的語法

實例初始化區塊一般放在建構函式之前,使用大括號 {} 擴起來的程式碼。語法結構一般如下

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

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

類別中的實例初始化區塊 並不是類別所必須的,而且,不限數量。一個類別既可以沒有實例初始化區塊,也可以有多個實例初始化區塊。

如果一個類別有多個實例初始化區塊,那麼它們會按照順序從上到下依序執行,也就是說,定義在類別頂部的實例初始化區塊最先執行。

我們來看一段程式碼,下面的類別 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. 執行目前類別的建構子

實例初始化區塊的要點

我們一起來回顧下實例初始化區塊的要點。

  • 每次建立新實例時都會執行實例初始化區塊

  • #初始化區塊會依照它們在類別中出現的順序執行

  • 如果存在父類,則會先實例化父類別然後在呼叫目前類別的實例初始化區塊,最後再呼叫目前類別的建構子。

#

以上是Java中的實例初始化區塊 ( IIB)的詳細介紹(程式碼範例)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:cnblogs.com。如有侵權,請聯絡admin@php.cn刪除