代碼塊
介紹:代碼塊又稱為初始化塊 ,屬于類中的成員(即是類的一部分),類似于方法,將邏輯語句封裝 在方法體中,通過{}
包圍起來
與類方法的不同點
一、代碼塊的基本使用
1. 修飾符 可選,要寫 的話,只能 寫static
3. 代碼塊的內容 :可以為任何邏輯語句(輸入,輸出,方法調用,循環,判斷等) 應用舉例:如果多個構造器中都有重復的語句 ,可以抽取到初始化塊中,提高代碼的復用性
{ System . out. println ( "我是末尾沒有分號的代碼塊" ) ;
}
{ System . out. println ( "我是末尾帶有分號的代碼塊" ) ;
} ;
二、代碼塊的使用細節 (重點,難點 )
(1)static 代碼塊 也叫靜態代碼塊,它隨著類的加載而執行 ,并且只會執行一次 。 (3)類在什么時候被加載 (非常重要!!! ) 1. 創建對象實例時(new) 3. 使用類的靜態成員
時(靜態屬性,靜態方法) 1.調用靜態代碼塊 和靜態屬性初始化 (注意:靜態代碼塊
和靜態屬性
初始化調用的優先級一樣 ,如果有多個靜態代碼塊和多個 靜態變量初始化,則按他們定義的順序調用 ) 3. 調用構造方法 。 1. 隱含了super() 注意:類的加載會完成靜態屬性的初始化和靜態代碼塊的調用,所有構造器在類加載后調用 一、類加載 時,靜態相關的內容 父類的靜態代碼塊和靜態屬性(優先級一樣,按定義順序執行) 二、構造器 的調用過程實現 父類的普通代碼塊和普通屬性初始化(優先級一樣,按定義順序執行) 子類的普通代碼塊和普通屬性初始化(優先級一樣,按定義順序執行) 總結: 1. 首先有繼承關系,現有父類,后有子類 (1)類加載---->靜態代碼塊和靜態屬性的初始化(調用順序看定義順序) (3)普通代碼塊的調用和普通屬性的初始化 (6)靜態 代碼塊只能調用靜態 成員(靜態屬性和靜態方法
三、代碼示例:體會代碼塊的調用和類加載的過程
package codeblock ; public class main { public static void main ( String [ ] args) { new b ( ) ; }
} class a{ static { System . out. println ( "調用 父類 的 static 代碼塊" ) ; System . out. println ( ) ; test ( ) ; System . out. println ( "------------------------------------------" ) ; } ; { System . out. println ( "========類加載完畢,靜態相關內容初始化結束,進入 構造器 的初始化!!!========\n" ) ; System . out. println ( "------------------------------------------" ) ; System . out. println ( "調用 父類 的 普通 代碼塊" ) ; System . out. println ( ) ; test ( ) ; test1 ( ) ; System . out. println ( "------------------------------------------" ) ; } ; public a ( ) { System . out. println ( "調用 父類 的構造器" ) ; System . out. println ( "------------------------------------------" ) ; System . out. println ( ) ; System . out. println ( "===========該類的所有初始化工作結束,接著完成子類的初始化工作===========\n" ) ; } public static void test ( ) { System . out. println ( "調用 父類 中的 static類型 的 test()方法" ) ; } public void test1 ( ) { System . out. println ( "調用 父類 中的 static類型 的 test1()方法" ) ; } } class b extends a{ static { System . out. println ( "調用 子類 的 static 代碼塊" ) ; System . out. println ( ) ; test ( ) ; System . out. println ( "------------------------------------------" ) ; System . out. println ( ) ; } ; { System . out. println ( "------------------------------------------" ) ; System . out. println ( "調用 子類 的 普通 代碼塊" ) ; System . out. println ( ) ; test ( ) ; test1 ( ) ; System . out. println ( "------------------------------------------" ) ; } ; public b ( ) { System . out. println ( "調用 子類 的構造器" ) ; System . out. println ( "------------------------------------------" ) ; System . out. println ( ) ; System . out. println ( "===========該類的所有初始化工作結束,接著完成子類的初始化工作===========\n" ) ; } public static void test ( ) { System . out. println ( "調用 子類 中的 static類型 的 test()方法" ) ; } public void test1 ( ) { System . out. println ( "調用 子類 中的 static類型 的 test1()方法" ) ; } }
輸出結果
調用 父類 的 static 代碼塊調用 父類 中的 static類型 的 test()方法
------------------------------------------
調用 子類 的 static 代碼塊調用 子類 中的 static類型 的 test()方法
------------------------------------------========類加載完畢,靜態相關內容初始化結束,進入 構造器 的初始化!!!========------------------------------------------
調用 父類 的 普通 代碼塊調用 父類 中的 static類型 的 test()方法
調用 子類 中的 static類型 的 test1()方法
------------------------------------------
調用 父類 的構造器
------------------------------------------===========該類的所有初始化工作結束,接著完成子類的初始化工作===========------------------------------------------
調用 子類 的 普通 代碼塊調用 子類 中的 static類型 的 test()方法
調用 子類 中的 static類型 的 test1()方法
------------------------------------------
調用 子類 的構造器
------------------------------------------===========該類的所有初始化工作結束,接著完成子類的初始化工作===========進程已結束,退出代碼0