JAVA面試題解惑系列(三)——變量(屬性)的覆蓋
http://www.javaeye.com/topic/211281變量,或者叫做類的屬性,在繼承的情況下,如果父類和子類存在同名的變量會(huì)出現(xiàn)什么情況呢?這一次,我們就一起來(lái)回顧一下這個(gè)問(wèn)題——變量(屬性)的覆蓋。
這個(gè)問(wèn)題雖然簡(jiǎn)單,但是情況卻比較復(fù)雜。因?yàn)槲覀儾粌H要考慮變量、靜態(tài)變量和常量三種情況,還要考慮private、friendly(即不加訪問(wèn)修飾符)、protected和public四種訪問(wèn)權(quán)限下對(duì)屬性的不同影響。
我們先從普通變量說(shuō)起。依照我們的慣例,先來(lái)看一段代碼:

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

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

這段代碼的運(yùn)行結(jié)果如下:
- ParentClass parentClass = new ParentClass();
- 父類變量--private
- 父類變量--friendly
- 父類變量--protected
- 父類變量--public
- ParentClass subClass = new SubClass();
- 子類變量--private
- 父類變量--friendly
- 父類變量--protected
- 父類變量--public
- SubClass subClazz = new SubClass();
- 子類變量--private
- 子類變量--friendly
- 子類變量--protected
- 子類變量--public
從上面的結(jié)果中可以看出,private的變量與其它三種訪問(wèn)權(quán)限變量的不同,這是由于方法的重寫(override)而引起的。關(guān)于重寫知識(shí)的回顧留給以后的章節(jié),這里我們來(lái)看一下其它三種訪問(wèn)權(quán)限下變量的覆蓋情況。
分析上面的輸出結(jié)果就會(huì)發(fā)現(xiàn),變量的值取決于我們定義的變量的類型,而不是創(chuàng)建的對(duì)象的類型。
在上面的例子中,同名的變量訪問(wèn)權(quán)限也是相同的,那么對(duì)于名稱相同但是訪問(wèn)權(quán)限不同的變量,情況又會(huì)怎樣呢?事實(shí)勝于雄辯,我們繼續(xù)來(lái)做測(cè)試。由于private變量的特殊性,在接下來(lái)的實(shí)驗(yàn)中我們都把它排除在外,不予考慮。
由于上面的例子已經(jīng)說(shuō)明了,當(dāng)變量類型是父類(ParentClass)時(shí),不管我們創(chuàng)建的對(duì)象是父類(ParentClass)的還是子類(SubClass)的,都不存在屬性覆蓋的問(wèn)題,因此接下來(lái)我們也只考慮變量類型和創(chuàng)建對(duì)象都是子類(SubClass)的情況













運(yùn)行結(jié)果:
子類變量













上面兩段不同的代碼,輸出結(jié)果確是相同的。事實(shí)上,我們可以將父類和子類屬性前的訪問(wèn)修飾符在friendly、protected和public之間任意切換,得到的結(jié)果都是相同的。也就是說(shuō)訪問(wèn)修飾符并不影響屬性的覆蓋,關(guān)于這一點(diǎn)大家可以自行編寫測(cè)試代碼驗(yàn)證。
對(duì)于靜態(tài)變量和常量又會(huì)怎樣呢?我們繼續(xù)來(lái)看























- 子類靜態(tài)變量
- 子類常量
- 子類靜態(tài)常量
雖然上面的結(jié)果中包含“子類靜態(tài)變量”和“子類靜態(tài)常量”,但這并不表示父類的“靜態(tài)變量”和“靜態(tài)常量”可以被子類覆蓋,因?yàn)樗鼈兌际菍儆陬悾粚儆趯?duì)象。
上面的例子中,我們一直用對(duì)象來(lái)對(duì)變量(屬性)的覆蓋做測(cè)試,如果是基本類型的變量,結(jié)果是否會(huì)相同呢?答案是肯定的,這里我們就不再一一舉例說(shuō)明了。
最后,我們來(lái)做個(gè)總結(jié)。通過(guò)以上測(cè)試,可以得出一下結(jié)論:
- 由于private變量受訪問(wèn)權(quán)限的限制,它不能被覆蓋。
- 屬性的值取父類還是子類并不取決于我們創(chuàng)建對(duì)象的類型,而是取決于我們定義的變量的類型。
- friendly、protected和public修飾符并不影響屬性的覆蓋。
- 靜態(tài)變量和靜態(tài)常量屬于類,不屬于對(duì)象,因此它們不能被覆蓋。
- 常量可以被覆蓋。
- 對(duì)于基本類型和對(duì)象,它們適用同樣的覆蓋規(guī)律。
posted on 2008-08-22 13:07 gdufo 閱讀(241) 評(píng)論(0) 編輯 收藏 所屬分類: JAVA 基礎(chǔ)