static同建構函式的執行順序

2021-08-29 08:56:09 字數 1924 閱讀 1876

例1:

abstract class glyph

7 abstract void draw();

8 }

9 10 class roundglyph extends glyph

1617 void draw()

21 }

22 23 public class polyconstructors

27 }

答案:1 glyph() before draw()

2 roundglyph.draw(), radius = 0

3 glyph() after draw()

4 roundglyph.roundglyph(), radius = 5

分析:分析

1類初始化時構造函式呼叫順序:

2 首先載入類,遇到extends字樣會停止載入當前類,載入父類,之後再繼續載入。

3 當把乙個類完全載入後,這個類的靜態成員將被先載入。之後進行如下流程:

4(1)初始化物件的儲存空間為零或null值;

5(2)呼叫父類建構函式;

6(3)按順序分別呼叫類成員變數和例項成員變數的初始化表示式;

7(4)呼叫本身建構函式

8 9建構函式的初始化順序:

101 .當執行new roundglyph( 5 )時,首先會載入『roundglyph. class 』,但是這個時候jvm發現 roundglyph extends (繼承於) glyph ,所以他會載入glyph. class

112 .然後會初始化glyph類的static成員資料,這個類沒有static成員資料,所以沒有這一步。

123 .會執行glyph類的建構函式glyph()

134 .接著初始化roundglyph類的成員資料,最後呼叫roundglyph()建構函式來生產物件

例2:1public class test2 extends test1

5 test2()

8 static

11

14 public static void main(string args)

17}

1819class test1

23 static

26}答案:635142

解析: 1( 1 ) 虛擬機器試圖載入test2,其父類為test1

2 ( 2 ) 虛擬機器載入test1

3 ( 3 ) test1靜態初始化 -----> 輸出 " 6 "

4 ( 4 ) 虛擬機器載入test2

5 ( 3 ) test2靜態初始化 -----> 輸出 " 3 "

6 ( 5 ) new test2()構造test2首先構造父類test1

7 ( 6 ) test1構造 -----> 輸出 " 5 "

8 ( 7 ) test2執行初始化語句塊(虛擬機器呼叫test2初始化方法init) -----> 輸出 " 1 " 和 " 4 "

9 ( 8 ) test2構造 -----> 輸出 " 2 "

10 11 ******************************===

12 先輸出6:

13 因為父類的static的變數 / 常量會被子類共享

14 所以,首先輸出6

15 接著,會先初始化自身的static的變數 / 常量

16 17 然後,在建構函式中,會首先呼叫父類的預設建構函式(如果沒有顯示呼叫super(args)的話)

18 在呼叫父類建構函式時,在執行建構函式體中的資料內容時,先執行方法外的程式段,如變數申明,或者程式段。然後再呼叫建構函式中的程式段。

19 然後再執行自身的建構函式,執行前,也如上述說:在執行本建構函式體中的資料內容時,先執行方法外的程式段,如變數申明,或者程式段。然後再呼叫建構函式中的程式段。

20 21 這就是乙個物件的例項化過程。

static靜態塊 建構函式。主方法的執行順序!

在你類載入的時候就執行了。在你類載入的時候就開始宣告或者定義了,並且存在於整個程式中,你可以再任何時刻對該值進行修改。直接類名點靜態方法就可以使用。在你定義類物件的時候,不是宣告,是定義,也就是 a a new a 而不是a a 方法很多人疑惑主方法也有static修飾,那麼它在什麼時候執行呢。其實...

建構函式與static執行順序

2015年的第一篇,1 static靜態塊 jvm載入類時就會執行,而建構函式是你在例項化物件是才會執行。public class testutil public testutil public void ff public static void main string args 因此執行上面 的...

靜態語句塊 構造語句塊以及建構函式的執行順序

class helloa static public class hellob extends helloa static public static void main string args 輸出 static astatic b main start i m a class helloa i ...