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

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

測(cè)試類示例代碼

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

后臺(tái)輸出結(jié)果






















為了能更好的看出后臺(tái)的輸出是哪一行代碼執(zhí)行的結(jié)果,我用了 @和數(shù)字來(lái)做了標(biāo)記,希望大家不要看暈了哈 ^_^
最后針對(duì)輸出結(jié)果簡(jiǎn)單說(shuō)一下:
@1 說(shuō)明,靜態(tài)(類變量、靜態(tài)代碼塊)屬于類本身,不依賴于類的實(shí)例
@6 說(shuō)明,在創(chuàng)建類的實(shí)例對(duì)象的時(shí)候,非靜態(tài)代碼塊比構(gòu)造器代碼塊更早的執(zhí)行
@3 4 說(shuō)明,當(dāng)類變量的值改變后,再通過(guò)類或類的實(shí)例來(lái)訪問(wèn)類變量,得到的將是被改變后的值
@5 說(shuō)明,非靜態(tài)(實(shí)例變量、非靜態(tài)代碼塊)的地位是相等的,它們將按順序被執(zhí)行,但會(huì)比構(gòu)造器中的代碼塊更早的執(zhí)行