JAVA面試題解惑系列_第1頁(yè)
JAVA面試題解惑系列_第2頁(yè)
JAVA面試題解惑系列_第3頁(yè)
JAVA面試題解惑系列_第4頁(yè)
JAVA面試題解惑系列_第5頁(yè)
已閱讀5頁(yè),還剩10頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、JAVA面試題解惑系列(一)類(lèi)的初始化順序博客分類(lèi): JAVA面試題解惑系列面試java對(duì)于靜態(tài)變量、靜態(tài)初始化塊、變量、初始化塊、構(gòu)造器,它們的初始化順序依次是(靜態(tài)變量、靜態(tài)初始化塊)(變量、初始化塊)構(gòu)造器。我們也可以通過(guò)下面的測(cè)試代碼來(lái)驗(yàn)證這一點(diǎn):Java代碼public class InitialOrderTest / 靜態(tài)變量 public static String staticField = 靜態(tài)變量; / 變量 public String field = 變量; / 靜態(tài)初始化塊 static System.out.println(staticField); System.o

2、ut.println(靜態(tài)初始化塊); / 初始化塊 System.out.println(field); System.out.println(初始化塊); / 構(gòu)造器 public InitialOrderTest() System.out.println(構(gòu)造器); public static void main(String args) new InitialOrderTest(); 運(yùn)行以上代碼,我們會(huì)得到如下的輸出結(jié)果:靜態(tài)變量靜態(tài)初始化塊變量初始化塊構(gòu)造器這與上文中說(shuō)的完全符合。那么對(duì)于繼承情況下又會(huì)怎樣呢?我們?nèi)匀灰砸欢螠y(cè)試代碼來(lái)獲取最終結(jié)果:Java代碼class Paren

3、t / 靜態(tài)變量 public static String p_StaticField = 父類(lèi)-靜態(tài)變量; / 變量 public String p_Field = 父類(lèi)-變量; / 靜態(tài)初始化塊 static System.out.println(p_StaticField); System.out.println(父類(lèi)-靜態(tài)初始化塊); / 初始化塊 System.out.println(p_Field); System.out.println(父類(lèi)-初始化塊); / 構(gòu)造器 public Parent() System.out.println(父類(lèi)-構(gòu)造器); public class

4、 SubClass extends Parent / 靜態(tài)變量 public static String s_StaticField = 子類(lèi)-靜態(tài)變量; / 變量 public String s_Field = 子類(lèi)-變量; / 靜態(tài)初始化塊 static System.out.println(s_StaticField); System.out.println(子類(lèi)-靜態(tài)初始化塊); / 初始化塊 System.out.println(s_Field); System.out.println(子類(lèi)-初始化塊); / 構(gòu)造器 public SubClass() System.out.prin

5、tln(子類(lèi)-構(gòu)造器); / 程序入口 public static void main(String args) new SubClass(); 運(yùn)行一下上面的代碼,結(jié)果馬上呈現(xiàn)在我們的眼前:父類(lèi)-靜態(tài)變量父類(lèi)-靜態(tài)初始化塊子類(lèi)-靜態(tài)變量子類(lèi)-靜態(tài)初始化塊父類(lèi)-變量父類(lèi)-初始化塊父類(lèi)-構(gòu)造器子類(lèi)-變量子類(lèi)-初始化塊子類(lèi)-構(gòu)造器現(xiàn)在,結(jié)果已經(jīng)不言自明了。大家可能會(huì)注意到一點(diǎn),那就是,并不是父類(lèi)完全初始化完畢后才進(jìn)行子類(lèi)的初始化,實(shí)際上子類(lèi)的靜態(tài)變量和靜態(tài)初始化塊的初始化是在父類(lèi)的變量、初始化塊和構(gòu)造器初始化之前就完成了。那么對(duì)于靜態(tài)變量和靜態(tài)初始化塊之間、變量和初始化塊之間的先后順序又是怎樣呢?

6、是否靜態(tài)變量總是先于靜態(tài)初始化塊,變量總是先于初始化塊就被初始化了呢?實(shí)際上這取決于它們?cè)陬?lèi)中出現(xiàn)的先后順序。我們以靜態(tài)變量和靜態(tài)初始化塊為例來(lái)進(jìn)行說(shuō)明。同樣,我們還是寫(xiě)一個(gè)類(lèi)來(lái)進(jìn)行測(cè)試:Java代碼public class TestOrder / 靜態(tài)變量 public static TestA a = new TestA(); / 靜態(tài)初始化塊 static System.out.println(靜態(tài)初始化塊); / 靜態(tài)變量 public static TestB b = new TestB(); public static void main(String args) new Test

7、Order(); class TestA public TestA() System.out.println(Test-A); class TestB public TestB() System.out.println(Test-B); 運(yùn)行上面的代碼,會(huì)得到如下的結(jié)果:Test-A靜態(tài)初始化塊Test-B大家可以隨意改變變量a、變量b以及靜態(tài)初始化塊的前后位置,就會(huì)發(fā)現(xiàn)輸出結(jié)果隨著它們?cè)陬?lèi)中出現(xiàn)的前后順序而改變,這就說(shuō)明靜態(tài)變量和靜態(tài)初始化塊是依照他們?cè)陬?lèi)中的定義順序進(jìn)行初始化的。同樣,變量和初始化塊也遵循這個(gè)規(guī)律。了解了繼承情況下類(lèi)的初始化順序之后,如何判斷最終輸出結(jié)果就迎刃而解了。JAV

8、A面試題解惑系列(二)到底創(chuàng)建了幾個(gè)String對(duì)象博客分類(lèi): JAVA面試題解惑系列面試javaJava代碼1. String str=new String(abc);緊接著這段代碼之后的往往是這個(gè)問(wèn)題,那就是這行代碼究竟創(chuàng)建了幾個(gè)String對(duì)象呢?相信大家對(duì)這道題并不陌生,答案也是眾所周知的,2個(gè)。接下來(lái)我們就從這道題展開(kāi),一起回顧一下與創(chuàng)建String對(duì)象相關(guān)的一些JAVA知識(shí)。我們可以把上面這行代碼分成String str、=、abc和new String()四部分來(lái)看待。String str只是定義了一個(gè)名為str的String類(lèi)型的變量,因此它并沒(méi)有創(chuàng)建對(duì)象;=是對(duì)變量str進(jìn)行

9、初始化,將某個(gè)對(duì)象的引用(或者叫句柄)賦值給 它,顯然也沒(méi)有創(chuàng)建對(duì)象;現(xiàn)在只剩下new String(abc)了。那么,new String(abc)為什么又能被看成abc和new String()呢?我們來(lái)看一下被我們調(diào)用了的String的構(gòu)造器:Java代碼1. public String(String original) 2. /other code .3. 大家都知道,我們常用的創(chuàng)建一個(gè)類(lèi)的實(shí)例(對(duì)象)的方法有以下兩種:1. 使用new創(chuàng)建對(duì)象。2. 調(diào)用Class類(lèi)的newInstance方法,利用反射機(jī)制創(chuàng)建對(duì)象。我們正是使用new調(diào)用了String類(lèi)的上面那個(gè)構(gòu)造器方法創(chuàng)建了一個(gè)

10、對(duì)象,并將它的引用賦值給了str變量。同時(shí)我們注意到,被調(diào)用的構(gòu)造器方法接受 的參數(shù)也是一個(gè)String對(duì)象,這個(gè)對(duì)象正是abc。由此我們又要引入另外一種創(chuàng)建String對(duì)象的方式的討論引號(hào)內(nèi)包含文本。這種方式是String特有的,并且它與new的方式存在很大區(qū)別。Java代碼1. String str=abc;毫無(wú)疑問(wèn),這行代碼創(chuàng)建了一個(gè)String對(duì)象。Java代碼1. String a=abc;2. String b=abc;那這里呢?答案還是一個(gè)。Java代碼1. String a=ab+cd;再看看這里呢?答案仍是一個(gè)。有點(diǎn)奇怪嗎?說(shuō)到這里,我們就需要引入對(duì)字符串池相關(guān)知識(shí)的回顧了。

11、在JAVA虛擬機(jī)(JVM)中存在著一個(gè)字符串池,其中保存著很多String對(duì)象,并且可以被共享使用,因此它提高了效率。由于String類(lèi)是 final的,它的值一經(jīng)創(chuàng)建就不可改變,因此我們不用擔(dān)心String對(duì)象共享而帶來(lái)程序的混亂。字符串池由String類(lèi)維護(hù),我們可以調(diào)用 intern()方法來(lái)訪問(wèn)字符串池。我們?cè)倩仡^看看String a=abc;,這行代碼被執(zhí)行的時(shí)候,JAVA虛擬機(jī)首先在字符串池中查找是否已經(jīng)存在了值為abc的這么一個(gè)對(duì)象,它的判斷依據(jù)是String 類(lèi)equals(Object obj)方法的返回值。如果有,則不再創(chuàng)建新的對(duì)象,直接返回已存在對(duì)象的引用;如果沒(méi)有,則先

12、創(chuàng)建這個(gè)對(duì)象,然后把它加入到字符串池中,再將它的引用返 回。因此,我們不難理解前面三個(gè)例子中頭兩個(gè)例子為什么是這個(gè)答案了。對(duì)于第三個(gè)例子:Java代碼1. String a=ab+cd;由于常量的值在編譯的時(shí)候就被確定了。在這里,ab和cd都是常量,因此變量a的值在編譯時(shí)就可以確定。這行代碼編譯后的效果等同于:Java代碼1. String a=abcd;因此這里只創(chuàng)建了一個(gè)對(duì)象abcd,并且它被保存在字符串池里了?,F(xiàn)在問(wèn)題又來(lái)了,是不是所有經(jīng)過(guò)“+”連接后得到的字符串都會(huì)被添加到字符串池中呢?我們都知道“=”可以用來(lái)比較兩個(gè)變量,它有以下兩種情況:1. 如果比較的是兩個(gè)基本類(lèi)型(char,b

13、yte,short,int,long,float,double,boolean),則是判斷它們的值是否相等。2. 如果表較的是兩個(gè)對(duì)象變量,則是判斷它們的引用是否指向同一個(gè)對(duì)象。下面我們就用“=”來(lái)做幾個(gè)測(cè)試。為了便于說(shuō)明,我們把指向字符串池中已經(jīng)存在的對(duì)象也視為該對(duì)象被加入了字符串池:Java代碼1. public class StringTest 2. public static void main(String args) 3. String a = ab;/ 創(chuàng)建了一個(gè)對(duì)象,并加入字符串池中4. System.out.println(String a = ab;);5. String

14、b = cd;/ 創(chuàng)建了一個(gè)對(duì)象,并加入字符串池中6. System.out.println(String b = cd;);7. String c = abcd;/ 創(chuàng)建了一個(gè)對(duì)象,并加入字符串池中8. 9. String d = ab + cd;10. / 如果d和c指向了同一個(gè)對(duì)象,則說(shuō)明d也被加入了字符串池11. if (d = c) 12. System.out.println(ab+cd 創(chuàng)建的對(duì)象 加入了 字符串池中);13. 14. / 如果d和c沒(méi)有指向了同一個(gè)對(duì)象,則說(shuō)明d沒(méi)有被加入字符串池15. else 16. System.out.println(ab+cd 創(chuàng)建的對(duì)

15、象 沒(méi)加入 字符串池中);17. 18. 19. String e = a + cd;20. / 如果e和c指向了同一個(gè)對(duì)象,則說(shuō)明e也被加入了字符串池21. if (e = c) 22. System.out.println( a +cd 創(chuàng)建的對(duì)象 加入了 字符串池中);23. 24. / 如果e和c沒(méi)有指向了同一個(gè)對(duì)象,則說(shuō)明e沒(méi)有被加入字符串池25. else 26. System.out.println( a +cd 創(chuàng)建的對(duì)象 沒(méi)加入 字符串池中);27. 28. 29. String f = ab + b;30. / 如果f和c指向了同一個(gè)對(duì)象,則說(shuō)明f也被加入了字符串池31.

16、if (f = c) 32. System.out.println(ab+ b 創(chuàng)建的對(duì)象 加入了 字符串池中);33. 34. / 如果f和c沒(méi)有指向了同一個(gè)對(duì)象,則說(shuō)明f沒(méi)有被加入字符串池35. else 36. System.out.println(ab+ b 創(chuàng)建的對(duì)象 沒(méi)加入 字符串池中);37. 38. 39. String g = a + b;40. / 如果g和c指向了同一個(gè)對(duì)象,則說(shuō)明g也被加入了字符串池41. if (g = c) 42. System.out.println( a + b 創(chuàng)建的對(duì)象 加入了 字符串池中);43. 44. / 如果g和c沒(méi)有指向了同一個(gè)對(duì)象

17、,則說(shuō)明g沒(méi)有被加入字符串池45. else 46. System.out.println( a + b 創(chuàng)建的對(duì)象 沒(méi)加入 字符串池中);47. 48. 49. 運(yùn)行結(jié)果如下:1. String a = ab;2. String b = cd;3. ab+cd 創(chuàng)建的對(duì)象 加入了 字符串池中4. a +cd 創(chuàng)建的對(duì)象 沒(méi)加入 字符串池中5. ab+ b 創(chuàng)建的對(duì)象 沒(méi)加入 字符串池中6. a + b 創(chuàng)建的對(duì)象 沒(méi)加入 字符串池中從上面的結(jié)果中我們不難看出,只有使用引號(hào)包含文本的方式創(chuàng)建的String對(duì)象之間使用“+”連接產(chǎn)生的新對(duì)象才會(huì)被加入字符串池中。對(duì)于所有包含new方式新建對(duì)象(包

18、括null)的“+”連接表達(dá)式,它所產(chǎn)生的新對(duì)象都不會(huì)被加入字符串池中,對(duì)此我們不再贅述。但是有一種情況需要引起我們的注意。請(qǐng)看下面的代碼:Java代碼1. public class StringStaticTest 2. / 常量A3. public static final String A = ab;4. 5. / 常量B6. public static final String B = cd;7. 8. public static void main(String args) 9. / 將兩個(gè)常量用+連接對(duì)s進(jìn)行初始化10. String s = A + B;11. String t

19、= abcd;12. if (s = t) 13. System.out.println(s等于t,它們是同一個(gè)對(duì)象);14. else 15. System.out.println(s不等于t,它們不是同一個(gè)對(duì)象);16. 17. 18. 這段代碼的運(yùn)行結(jié)果如下: s等于t,它們是同一個(gè)對(duì)象這又是為什么呢?原因是這樣的,對(duì)于常量來(lái)講,它的值是固定的,因此在編譯期就能被確定了,而變量的值只有到運(yùn)行時(shí)才能被確定,因?yàn)檫@個(gè)變量可以被不同的 方法調(diào)用,從而可能引起值的改變。在上面的例子中,A和B都是常量,值是固定的,因此s的值也是固定的,它在類(lèi)被編譯時(shí)就已經(jīng)確定了。也就是說(shuō):Java代碼1. Str

20、ing s=A+B;等同于:Java代碼1. String s=ab+cd;我對(duì)上面的例子稍加改變看看會(huì)出現(xiàn)什么情況:Java代碼1. public class StringStaticTest 2. / 常量A3. public static final String A;4. 5. / 常量B6. public static final String B;7. 8. static 9. A = ab;10. B = cd;11. 12. 13. public static void main(String args) 14. / 將兩個(gè)常量用+連接對(duì)s進(jìn)行初始化15. String s =

21、 A + B;16. String t = abcd;17. if (s = t) 18. System.out.println(s等于t,它們是同一個(gè)對(duì)象);19. else 20. System.out.println(s不等于t,它們不是同一個(gè)對(duì)象);21. 22. 23. 它的運(yùn)行結(jié)果是這樣: s不等于t,它們不是同一個(gè)對(duì)象只是做了一點(diǎn)改動(dòng),結(jié)果就和剛剛的例子恰好相反。我們?cè)賮?lái)分析一下。A和B雖然被定義為常量(只能被賦值一次),但是它們都沒(méi)有馬上被賦值。在運(yùn)算出s的 值之前,他們何時(shí)被賦值,以及被賦予什么樣的值,都是個(gè)變數(shù)。因此A和B在被賦值之前,性質(zhì)類(lèi)似于一個(gè)變量。那么s就不能在編譯

22、期被確定,而只能在運(yùn)行時(shí) 被創(chuàng)建了。由于字符串池中對(duì)象的共享能夠帶來(lái)效率的提高,因此我們提倡大家用引號(hào)包含文本的方式來(lái)創(chuàng)建String對(duì)象,實(shí)際上這也是我們?cè)诰幊讨谐2捎玫?。接下?lái)我們?cè)賮?lái)看看intern()方法,它的定義如下:Java代碼1. public native String intern();這是一個(gè)本地方法。在調(diào)用這個(gè)方法時(shí),JAVA虛擬機(jī)首先檢查字符串池中是否已經(jīng)存在與該對(duì)象值相等對(duì)象存在,如果有則返回字符串池中對(duì)象的引用;如果沒(méi)有,則先在字符串池中創(chuàng)建一個(gè)相同值的String對(duì)象,然后再將它的引用返回。我們來(lái)看這段代碼:Java代碼1. public class String

23、InternTest 2. public static void main(String args) 3. / 使用char數(shù)組來(lái)初始化a,避免在a被創(chuàng)建之前字符串池中已經(jīng)存在了值為abcd的對(duì)象4. String a = new String(new char a, b, c, d );5. String b = ern();6. if (b = a) 7. System.out.println(b被加入了字符串池中,沒(méi)有新建對(duì)象);8. else 9. System.out.println(b沒(méi)被加入字符串池中,新建了對(duì)象);10. 11. 12. 運(yùn)行結(jié)果:1. b沒(méi)被加入字符

24、串池中,新建了對(duì)象如果String類(lèi)的intern()方法在沒(méi)有找到相同值的對(duì)象時(shí),是把當(dāng)前對(duì)象加入字符串池中,然后返回它的引用的話(huà),那么b和a指向的就是同一個(gè)對(duì) 象;否則b指向的對(duì)象就是JAVA虛擬機(jī)在字符串池中新建的,只是它的值與a相同罷了。上面這段代碼的運(yùn)行結(jié)果恰恰印證了這一點(diǎn)。最后我們?cè)賮?lái)說(shuō)說(shuō)String對(duì)象在JAVA虛擬機(jī)(JVM)中的存儲(chǔ),以及字符串池與堆(heap)和棧(stack)的關(guān)系。我們首先回顧一下堆和棧的區(qū)別: 棧(stack):主要保存基本類(lèi)型(或者叫內(nèi)置類(lèi)型)(char、byte、short、int、long、float、double、boolean)和對(duì)象的引用,

25、數(shù)據(jù)可以共享,速度僅次于寄存器(register),快于堆。 堆(heap):用于存儲(chǔ)對(duì)象。我們查看String類(lèi)的源碼就會(huì)發(fā)現(xiàn),它有一個(gè)value屬性,保存著String對(duì)象的值,類(lèi)型是char,這也正說(shuō)明了字符串就是字符的序列。當(dāng)執(zhí)行String a=abc;時(shí),JAVA虛擬機(jī)會(huì)在棧中創(chuàng)建三個(gè)char型的值a、b和c,然后在堆中創(chuàng)建一個(gè)String對(duì)象,它的值(value) 是剛才在棧中創(chuàng)建的三個(gè)char型值組成的數(shù)組a,b,c,最后這個(gè)新創(chuàng)建的String對(duì)象會(huì)被添加到字符串池中。如果我們接著執(zhí)行 String b=new String(abc);代碼,由于abc已經(jīng)被創(chuàng)建并保存于字符串

26、池中,因此JAVA虛擬機(jī)只會(huì)在堆中新創(chuàng)建一個(gè)String對(duì)象,但是它的值 (value)是共享前一行代碼執(zhí)行時(shí)在棧中創(chuàng)建的三個(gè)char型值值a、b和c。說(shuō)到這里,我們對(duì)于篇首提出的String str=new String(abc)為什么是創(chuàng)建了兩個(gè)對(duì)象這個(gè)問(wèn)題就已經(jīng)相當(dāng)明了了。解惑系列(三)變量(屬性)的覆蓋博客分類(lèi): JAVA面試題解惑系列javaJava代碼class ParentClass public int i = 10;public class SubClass extends ParentClass public int i = 30; public static void m

27、ain(String args) ParentClass parentClass = new SubClass(); SubClass subClass = new SubClass(); System.out.println(parentClass.i + subClass.i); 控制臺(tái)的輸出結(jié)果是多少呢?20?40?還是60?變量,或者叫做類(lèi)的屬性,在繼承的情況下,如果父類(lèi)和子類(lèi)存在同名的變量會(huì)出現(xiàn)什么情況呢?這就是這道題要考查的知識(shí)點(diǎn)變量(屬性)的覆蓋。這個(gè)問(wèn)題雖然簡(jiǎn)單,但是情況卻比較復(fù)雜。因?yàn)槲覀儾粌H要考慮變量、靜態(tài)變量和常量三種情況,還要考慮private、friendly(即不加

28、訪問(wèn)修飾符)、protected和public四種訪問(wèn)權(quán)限下對(duì)屬性的不同影響。我們先從普通變量說(shuō)起。依照我們的慣例,先來(lái)看一段代碼:Java代碼class ParentClass private String privateField = 父類(lèi)變量-private; /* friendly */String friendlyField = 父類(lèi)變量-friendly; protected String protectedField = 父類(lèi)變量-protected; public String publicField = 父類(lèi)變量-public; / private的變量無(wú)法直接訪問(wèn),因此我們

29、給他增加了一個(gè)訪問(wèn)方法 public String getPrivateFieldValue() return privateField; public class SubClass extends ParentClass private String privateField = 子類(lèi)變量-private; /* friendly */String friendlyField = 子類(lèi)變量-friendly; protected String protectedField = 子類(lèi)變量-protected; public String publicField = 子類(lèi)變量-public; /

30、 private的變量無(wú)法直接訪問(wèn),因此我們給他增加了一個(gè)訪問(wèn)方法 public String getPrivateFieldValue() return privateField; public static void main(String args) / 為了便于查閱,我們統(tǒng)一按照private、friendly、protected、public的順序 / 輸出下列三種情況中變量的值 / ParentClass類(lèi)型,ParentClass對(duì)象 ParentClass parentClass = new ParentClass(); System.out.println(ParentCla

31、ss parentClass = new ParentClass();); System.out.println(parentClass.getPrivateFieldValue(); System.out.println(parentClass.friendlyField); System.out.println(parentCtectedField); System.out.println(parentClass.publicField); System.out.println(); / ParentClass類(lèi)型,SubClass對(duì)象 ParentClass subCla

32、ss = new SubClass(); System.out.println(ParentClass subClass = new SubClass();); System.out.println(subClass.getPrivateFieldValue(); System.out.println(subClass.friendlyField); System.out.println(subCtectedField); System.out.println(subClass.publicField); System.out.println(); / SubClass類(lèi)型,S

33、ubClass對(duì)象 SubClass subClazz = new SubClass(); System.out.println(SubClass subClazz = new SubClass();); System.out.println(subClazz.getPrivateFieldValue(); System.out.println(subClazz.friendlyField); System.out.println(subCtectedField); System.out.println(subClazz.publicField); 這段代碼的運(yùn)行結(jié)果如下:Pa

34、rentClass parentClass = new ParentClass();父類(lèi)變量-private父類(lèi)變量-friendly父類(lèi)變量-protected父類(lèi)變量-publicParentClass subClass = new SubClass();子類(lèi)變量-private父類(lèi)變量-friendly父類(lèi)變量-protected父類(lèi)變量-publicSubClass subClazz = new SubClass();子類(lèi)變量-private子類(lèi)變量-friendly子類(lèi)變量-protected子類(lèi)變量-public從上面的結(jié)果中可以看出,private的變量與其它三種訪問(wèn)權(quán)限變量的不

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

36、在屬性覆蓋的問(wèn)題,因此接下來(lái)我們也只考慮變量類(lèi)型和創(chuàng)建對(duì)象都是子類(lèi)(SubClass)的情況。Java代碼class ParentClass /* friendly */String field = 父類(lèi)變量;public class SubClass extends ParentClass protected String field = 子類(lèi)變量; public static void main(String args) SubClass subClass = new SubClass(); System.out.println(subClass.field); 運(yùn)行結(jié)果: 子類(lèi)變量Java代碼class ParentClass public String field = 父類(lèi)變量;public class SubClass extends ParentClass protected String field

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論