舉一個實例程序:
class HelloA { public HelloA(){ System.out.println("Hello A!父類構造方法"); } { System.out.println("i'm A class.父類非靜態代碼塊"); } static{ System.out.println("static A 父類靜態代碼塊"); } } class HelloB extends HelloA { public HelloB(){ System.out.println("Hello B! 構造方法"); } { System.out.println("i'm B class.非靜態代碼塊"); } static{ System.out.println("static B 靜態代碼塊"); } public static void main(String[] args) { System.out.println("---start---"); new HelloB(); new HelloB(); System.out.println("---end---"); } }
輸出結果:
再來比較一段代碼,與上面幾乎如出一轍但是有一些細微的差別:
class A{ public A(){ System.out.println("A.普通代碼塊"); } { System.out.println("A.構造塊"); } static { System.out.println("A.靜態塊"); } } class B extends A{ public void B(){ System.out.println("B.普通代碼塊"); } { System.out.println("B.構造塊"); } static { System.out.println("B.靜態塊"); } } class Test{ public static void main(String[] args) { System.out.println("*******start*******"); new B(); new B(); System.out.println("*******end*******"); } }
輸出結果:
不同之處在於:第二段代碼的開始菜單打印在非主類里面(沒有public修飾的類),所以靜態代碼塊並不優先於測試類(Test)里面的開始菜單執行
第二點:第二段代碼里面的子類的B方法並不是構造方法,因為它加了修飾詞void,就不成了構造方法構造方法 ,所以就不打印public void B方法里面的東西,所謂構造方法:
名字和類名一樣
沒有任何返回類型
void 是返回為空,所以不是構造方法,就算是空也不行
構造:public test(){},public test(int a){}
分析:
代碼塊定義:使用 {} 定義的一段代碼。
根據代碼塊定義的位置以及關鍵字,又可分為以下四種:
普通代碼塊 構造快 靜態塊 同步代碼塊(后續講解多線程部分再談)
普通代碼塊:定義在方法中的代碼塊
一般如果方法中代碼過長,為避免變量重名,使用普通代碼塊。(使用較少,了解概念即可)。
構造塊:定義在類中的代碼塊(不加修飾符)
構造塊優先於構造方法執行,每產生一個新的對象就調用一次構造塊,構造塊可以進行簡 單的邏輯操作(在調用構造方法前)
靜態代碼塊:使用static定義的代碼塊
根據靜態塊所在的類的不同又可分為以下兩種類型
1. 在非主類中 2. 在主類中
通過以上代碼我們可以發現:
1. 靜態塊優先於構造塊執行。 2. 無論產生多少實例化對象,靜態塊都只執行一次。 靜態塊的主要作用是為static屬性進行初始化
在主類中定義的靜態塊,優先於主方法(main)執行
總結:針對以上對代碼塊的講解,如果一些屬性需要在使用前做處理,可以考慮使用代碼塊。