前言:這屬于 java 的基礎知識,你可以不了解,也可以不拿它當一回事,代碼也一樣能敲的順暢;這是很久之前,我從 C++ 轉 java 剛入門那會的看法,那會我堅持自己的理念:
重實踐,講運用,輕理論。當然,對同一樣事物,在不同階段也會有不一樣的看法,這理念在某個時段已經不適合我,早就被拋棄了。不扯淡了,直接進入主題。
java 中的變量大致分為 成員變量 和 局部變量 兩大類。
成員變量:
在類體里面定義的變量稱為成員變量;
如果該成員變量有 static 關鍵字修飾,則該成員變量稱為 靜態變量 或 類變量;
如果該成員變量沒有 static 關鍵字修飾,則該成員變量被稱為 非靜態變量 或 實例變量。
局部變量:
形參、方法內定義的變量、代碼塊中定義的變量,都屬于局部變量。
類變量 (靜態變量)
1. 可以向前引用
2. 變量屬于類本身
3. 類變量不依賴類的實例,類變量只在初始化時候在棧內存中被分配一次空間,無論類的實例被創建幾次,都不再為類變量分配空間
4. 通過類的任意一個實例來訪問類變量,底層都將將其轉為通過類本身來訪問類變量,它們的效果是一樣的
5. 一旦類變量的值被改變,通過類或類的任意一個實例來訪問類變量,得到的都將是被改變后的值
6. 將在類的初始化之前初始化
實例變量(非靜態變量)
1. 不能向前引用,如果向前引用,則稱為非法向前引用,這是不允許的
2. 變量屬于類的實例對象
3. 隨著類的實例被創建而分配內存空間
非靜態代碼塊
直接由 { } 包起來的代碼,稱為非靜態代碼塊
靜態代碼塊
直接由 static { } 包起來的代碼,稱為靜態代碼塊
類變量(靜態變量)、實例變量(非靜態變量)、靜態代碼塊、非靜態代碼塊 的初始化時機
由 static 關鍵字修飾的(如:類變量[靜態變量]、靜態代碼塊)將在類被初始化創建實例對象之前被初始化,而且是按順序從上到下依次被執行;
沒有 static 關鍵字修飾的(如:實例變量[非靜態變量]、非靜態代碼塊)初始化實際上是會被提取到類的構造器中被執行的,但是會比類構造器中的
代碼塊優先執行到,其也是按順序從上到下依次被執行。
- 以上是本人在翻完 PDF 后的個人筆記和理解以及見解,不見得百分百對,以下附上本人測試示例代碼,會更有說服性
示例代碼

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

測試類示例代碼

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

后臺輸出結果






















為了能更好的看出后臺的輸出是哪一行代碼執行的結果,我用了 @和數字來做了標記,希望大家不要看暈了哈 ^_^
最后針對輸出結果簡單說一下:
@1 說明,靜態(類變量、靜態代碼塊)屬于類本身,不依賴于類的實例
@6 說明,在創建類的實例對象的時候,非靜態代碼塊比構造器代碼塊更早的執行
@3 4 說明,當類變量的值改變后,再通過類或類的實例來訪問類變量,得到的將是被改變后的值
@5 說明,非靜態(實例變量、非靜態代碼塊)的地位是相等的,它們將按順序被執行,但會比構造器中的代碼塊更早的執行