Java基礎(chǔ)知識(shí)整理_第1頁(yè)
Java基礎(chǔ)知識(shí)整理_第2頁(yè)
Java基礎(chǔ)知識(shí)整理_第3頁(yè)
Java基礎(chǔ)知識(shí)整理_第4頁(yè)
Java基礎(chǔ)知識(shí)整理_第5頁(yè)
已閱讀5頁(yè),還剩7頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1.Java里抽象類和接口的區(qū)別在\o"java"Java語(yǔ)言中,abstractclass和\o"接口"interface是支持\o"抽象類"抽象類定義的兩種機(jī)制。正是由于這兩種機(jī)制的存在,才賦予了Java強(qiáng)大的面向?qū)ο竽芰?。abstractclass和interface之間在對(duì)于抽象類定義的支持方面具有很大的相似性,甚至可以相互替換,因此很多開發(fā)者在進(jìn)行抽象類定義時(shí)對(duì)于abstractclass和interface的選擇顯得比較隨意。其實(shí),兩者之間還是有很大的區(qū)別的,對(duì)于它們的選擇甚至反映出對(duì)于問題領(lǐng)域本質(zhì)的理解、對(duì)于設(shè)計(jì)意圖的理解是否正確、合理。本文將對(duì)它們之間的區(qū)別進(jìn)行一番剖析,試圖給開發(fā)者提供一個(gè)在二者之間進(jìn)行選擇的依據(jù)。

理解抽象類

abstractclass和interface在Java語(yǔ)言中都是用來進(jìn)行抽象類(本文中的抽象類并非從abstractclass翻譯而來,它表示的是一個(gè)抽象體,而abstractclass為Java語(yǔ)言中用于定義抽象類的一種方法,請(qǐng)讀者注意區(qū)分)定義的,那么什么是抽象類,使用抽象類能為我們帶來什么好處呢?

在面向?qū)ο蟮母拍钪?,我們知道所有的?duì)象都是通過類來描繪的,但是反過來卻不是這樣。并不是所有的類都是用來描繪對(duì)象的,如果一個(gè)類中沒有包含足夠的信息來描繪一個(gè)具體的對(duì)象,這樣的類就是抽象類。抽象類往往用來表征我們?cè)趯?duì)問題領(lǐng)域進(jìn)行分析、設(shè)計(jì)中得出的抽象概念,是對(duì)一系列看上去不同,但是本質(zhì)上相同的具體概念的抽象。比如:如果我們進(jìn)行一個(gè)圖形編輯軟件的開發(fā),就會(huì)發(fā)現(xiàn)問題領(lǐng)域存在著圓、三角形這樣一些具體概念,它們是不同的,但是它們又都屬于形狀這樣一個(gè)概念,形狀這個(gè)概念在問題領(lǐng)域是不存在的,它就是一個(gè)抽象概念。正是因?yàn)槌橄蟮母拍钤趩栴}領(lǐng)域沒有對(duì)應(yīng)的具體概念,所以用以表征抽象概念的抽象類是不能夠?qū)嵗摹?/p>

在面向?qū)ο箢I(lǐng)域,抽象類主要用來進(jìn)行類型隱藏。我們可以構(gòu)造出一個(gè)固定的一組行為的抽象描述,但是這組行為卻能夠有任意個(gè)可能的具體實(shí)現(xiàn)方式。這個(gè)抽象描述就是抽象類,而這一組任意個(gè)可能的具體實(shí)現(xiàn)則表現(xiàn)為所有可能的派生類。模塊可以操作一個(gè)抽象體。由于模塊依賴于一個(gè)固定的抽象體,因此它可以是不允許修改的;同時(shí),通過從這個(gè)抽象體派生,也可擴(kuò)展此模塊的行為功能。熟悉OCP的讀者一定知道,為了能夠?qū)崿F(xiàn)面向?qū)ο笤O(shè)計(jì)的一個(gè)最核心的原則OCP(Open-ClosedPrinciple),抽象類是其中的關(guān)鍵所在。

從語(yǔ)法定義層面看abstractclass和interface

在語(yǔ)法層面,Java語(yǔ)言對(duì)于abstractclass和interface給出了不同的定義方式,下面以定義一個(gè)名為Demo的抽象類為例來說明這種不同。

使用abstractclass的方式定義Demo抽象類的方式如下:abstractclassDemo{

abstractvoidmethod1();

abstractvoidmethod2();

使用interface的方式定義Demo抽象類的方式如下:interfaceDemo{

voidmethod1();

voidmethod2();

}

在abstractclass方式中,Demo可以有自己的數(shù)據(jù)成員,也可以有非abstract的成員方法,而在interface方式的實(shí)現(xiàn)中,Demo只能夠有靜態(tài)的不能被修改的數(shù)據(jù)成員(也就是必須是staticfinal的,不過在interface中一般不定義數(shù)據(jù)成員),所有的成員方法都是abstract的。從某種意義上說,interface是一種特殊形式的abstractclass。

從編程的角度來看,abstractclass和interface都可以用來實(shí)現(xiàn)"designbycontract"的思想。但是在具體的使用上面還是有一些區(qū)別的。

首先,abstractclass在Java語(yǔ)言中表示的是一種繼承關(guān)系,一個(gè)類只能使用一次繼承關(guān)系(因?yàn)镴ava不支持多繼承--轉(zhuǎn)注)。但是,一個(gè)類卻可以實(shí)現(xiàn)多個(gè)interface。也許,這是Java語(yǔ)言的設(shè)計(jì)者在考慮Java對(duì)于多重繼承的支持方面的一種折中考慮吧。

其次,在abstractclass的定義中,我們可以賦予方法的默認(rèn)行為。但是在interface的定義中,方法卻不能擁有默認(rèn)行為,為了繞過這個(gè)限制,必須使用委托,但是這會(huì)增加一些復(fù)雜性,有時(shí)會(huì)造成很大的麻煩。

在抽象類中不能定義默認(rèn)行為還存在另一個(gè)比較嚴(yán)重的問題,那就是可能會(huì)造成維護(hù)上的麻煩。因?yàn)槿绻髞硐胄薷念惖慕缑妫ㄒ话阃ㄟ^abstractclass或者interface來表示)以適應(yīng)新的情況(比如,添加新的方法或者給已用的方法中添加新的參數(shù))時(shí),就會(huì)非常的麻煩,可能要花費(fèi)很多的時(shí)間(對(duì)于派生類很多的情況,尤為如此)。但是如果界面是通過abstractclass來實(shí)現(xiàn)的,那么可能就只需要修改定義在abstractclass中的默認(rèn)行為就可以了。

同樣,如果不能在抽象類中定義默認(rèn)行為,就會(huì)導(dǎo)致同樣的方法實(shí)現(xiàn)出現(xiàn)在該抽象類的每一個(gè)派生類中,違反了"onerule,oneplace"原則,造成代碼重復(fù),同樣不利于以后的維護(hù)。因此,在abstractclass和interface間進(jìn)行選擇時(shí)要非常的小心。

從設(shè)計(jì)理念層面看abstractclass和interface

上面主要從語(yǔ)法定義和編程的角度論述了abstractclass和interface的區(qū)別,這些層面的區(qū)別是比較低層次的、非本質(zhì)的。本小節(jié)將從另一個(gè)層面:abstractclass和interface所反映出的設(shè)計(jì)理念,來分析一下二者的區(qū)別。作者認(rèn)為,從這個(gè)層面進(jìn)行分析才能理解二者概念的本質(zhì)所在。

前面已經(jīng)提到過,abstractclass在Java語(yǔ)言中體現(xiàn)了一種繼承關(guān)系,要想使得繼承關(guān)系合理,父類和派生類之間必須存在"is-a"關(guān)系,即父類和派生類在概念本質(zhì)上應(yīng)該是相同的。對(duì)于interface來說則不然,并不要求interface的實(shí)現(xiàn)者和interface定義在概念本質(zhì)上是一致的,僅僅是實(shí)現(xiàn)了interface定義的契約而已。為了使論述便于理解,下面將通過一個(gè)簡(jiǎn)單的實(shí)例進(jìn)行說明。

考慮這樣一個(gè)例子,假設(shè)在我們的問題領(lǐng)域中有一個(gè)關(guān)于Door的抽象概念,該Door具有執(zhí)行兩個(gè)動(dòng)作open和close,此時(shí)我們可以通過abstractclass或者interface來定義一個(gè)表示該抽象概念的類型,定義方式分別如下所示:

使用abstractclass方式定義Door:abstractclassDoor{

abstractvoidopen();

abstractvoidclose();

}

使用interface方式定義Door:interfaceDoor{

voidopen();

voidclose();

}

其他具體的Door類型可以extends使用abstractclass方式定義的Door或者implements使用interface方式定義的Door??雌饋砗孟袷褂胊bstractclass和interface沒有大的區(qū)別。

如果現(xiàn)在要求Door還要具有報(bào)警的功能。我們?cè)撊绾卧O(shè)計(jì)針對(duì)該例子的類結(jié)構(gòu)呢(在本例中,主要是為了展示abstractclass和interface反映在設(shè)計(jì)理念上的區(qū)別,其他方面無關(guān)的問題都做了簡(jiǎn)化或者忽略)?下面將羅列出可能的解決方案,并從設(shè)計(jì)理念層面對(duì)這些不同的方案進(jìn)行分析。

解決方案一:

簡(jiǎn)單的在Door的定義中增加一個(gè)alarm方法,如下:abstractclassDoor{

abstractvoidopen();

abstractvoidclose();

abstractvoidalarm();

}

或者interfaceDoor{

voidopen();

voidclose();

voidalarm();

}

那么具有報(bào)警功能的AlarmDoor的定義方式如下:classAlarmDoorextendsDoor{

voidopen(){…}

voidclose(){…}

voidalarm(){…}

}

或者classAlarmDoorimplementsDoor{

voidopen(){…}

voidclose(){…}

voidalarm(){…}

這種方法違反了面向?qū)ο笤O(shè)計(jì)中的一個(gè)核心原則ISP(InterfaceSegregationPrinciple),在Door的定義中把Door概念本身固有的行為方法和另外一個(gè)概念"報(bào)警器"的行為方法混在了一起。這樣引起的一個(gè)問題是那些僅僅依賴于Door這個(gè)概念的模塊會(huì)因?yàn)?報(bào)警器"這個(gè)概念的改變(比如:修改alarm方法的參數(shù))而改變,反之依然。

解決方案二:

既然open、close和alarm屬于兩個(gè)不同的概念,根據(jù)ISP原則應(yīng)該把它們分別定義在代表這兩個(gè)概念的抽象類中。定義方式有:這兩個(gè)概念都使用abstractclass方式定義;兩個(gè)概念都使用interface方式定義;一個(gè)概念使用abstractclass方式定義,另一個(gè)概念使用interface方式定義。

顯然,由于Java語(yǔ)言不支持多重繼承,所以兩個(gè)概念都使用abstractclass方式定義是不可行的。后面兩種方式都是可行的,但是對(duì)于它們的選擇卻反映出對(duì)于問題領(lǐng)域中的概念本質(zhì)的理解、對(duì)于設(shè)計(jì)意圖的反映是否正確、合理。我們一一來分析、說明。

如果兩個(gè)概念都使用interface方式來定義,那么就反映出兩個(gè)問題:1、我們可能沒有理解清楚問題領(lǐng)域,AlarmDoor在概念本質(zhì)上到底是Door還是報(bào)警器?2、如果我們對(duì)于問題領(lǐng)域的理解沒有問題,比如:我們通過對(duì)于問題領(lǐng)域的分析發(fā)現(xiàn)AlarmDoor在概念本質(zhì)上和Door是一致的,那么我們?cè)趯?shí)現(xiàn)時(shí)就沒有能夠正確的揭示我們的設(shè)計(jì)意圖,因?yàn)樵谶@兩個(gè)概念的定義上(均使用interface方式定義)反映不出上述含義。

如果我們對(duì)于問題領(lǐng)域的理解是:AlarmDoor在概念本質(zhì)上是Door,同時(shí)它有具有報(bào)警的功能。我們?cè)撊绾蝸碓O(shè)計(jì)、實(shí)現(xiàn)來明確的反映出我們的意思呢?前面已經(jīng)說過,abstractclass在Java語(yǔ)言中表示一種繼承關(guān)系,而繼承關(guān)系在本質(zhì)上是"is-a"關(guān)系。所以對(duì)于Door這個(gè)概念,我們應(yīng)該使用abstarctclass方式來定義。另外,AlarmDoor又具有報(bào)警功能,說明它又能夠完成報(bào)警概念中定義的行為,所以報(bào)警概念可以通過interface方式定義。如下所示:abstractclassDoor{

abstractvoidopen();

abstractvoidclose();

}

interfaceAlarm{

voidalarm();

}

classAlarmDoorextendsDoorimplementsAlarm{

voidopen(){…}

voidclose(){…}

voidalarm(){…}

}

這種實(shí)現(xiàn)方式基本上能夠明確的反映出我們對(duì)于問題領(lǐng)域的理解,正確的揭示我們的設(shè)計(jì)意圖。其實(shí)abstractclass表示的是"is-a"關(guān)系,interface表示的是"like-a"關(guān)系,大家在選擇時(shí)可以作為一個(gè)依據(jù),當(dāng)然這是建立在對(duì)問題領(lǐng)域的理解上的,比如:如果我們認(rèn)為AlarmDoor在概念本質(zhì)上是報(bào)警器,同時(shí)又具有Door的功能,那么上述的定義方式就要反過來了。

小結(jié)

1.abstractclass在Java語(yǔ)言中表示的是一種繼承關(guān)系,一個(gè)類只能使用一次繼承關(guān)系。但是,一個(gè)類卻可以實(shí)現(xiàn)多個(gè)interface。

2.在abstractclass中可以有自己的數(shù)據(jù)成員,也可以有非abstarct的成員方法,而在interface中,只能夠有靜態(tài)的不能被修改的數(shù)據(jù)成員(也就是必須是staticfinal的,不過在interface中一般不定義數(shù)據(jù)成員),所有的成員方法都是abstract的。

3.abstractclass和interface所反映出的設(shè)計(jì)理念不同。其實(shí)abstractclass表示的是"is-a"關(guān)系,interface表示的是"like-a"關(guān)系。

4.實(shí)現(xiàn)抽象類和接口的類必須實(shí)現(xiàn)其中的所有方法。抽象類中可以有非抽象方法。接口中則不能有實(shí)現(xiàn)方法。

5.接口中定義的變量默認(rèn)是publicstaticfinal型,且必須給其初值,所以實(shí)現(xiàn)類中不能重新定義,也不能改變其值。

6.抽象類中的變量默認(rèn)是friendly型,其值可以在子類中重新定義,也可以重新賦值。

7.接口中的方法默認(rèn)都是public,abstract類型的。

結(jié)論

abstractclass和interface是Java語(yǔ)言中的兩種定義抽象類的方式,它們之間有很大的相似性。但是對(duì)于它們的選擇卻又往往反映出對(duì)于問題領(lǐng)域中的概念本質(zhì)的理解、對(duì)于設(shè)計(jì)意圖的反映是否正確、合理,因?yàn)樗鼈儽憩F(xiàn)了概念間的不同的關(guān)系(雖然都能夠?qū)崿F(xiàn)需求的功能)。這其實(shí)也是語(yǔ)言的一種的慣用法,希望讀者朋友能夠細(xì)細(xì)體會(huì)。1、Java接口和Java抽象類最大的一個(gè)區(qū)別,就在于Java抽象類可以提供某些方法的部分實(shí)現(xiàn),而Java接口不可以,這大概就是Java抽象類唯一的優(yōu)點(diǎn)吧,但這個(gè)優(yōu)點(diǎn)非常有用。

如果向一個(gè)抽象類里加入一個(gè)新的具體方法時(shí),那么它所有的子類都一下子都得到了這個(gè)新方法,而Java接口做不到這一點(diǎn),如果向一個(gè)Java接口里加入一個(gè)新方法,所有實(shí)現(xiàn)這個(gè)接口的類就無法成功通過編譯了,因?yàn)槟惚仨氉屆恳粋€(gè)類都再實(shí)現(xiàn)這個(gè)方法才行,這顯然是Java接口的缺點(diǎn)。2、一個(gè)抽象類的實(shí)現(xiàn)只能由這個(gè)抽象類的子類給出,也就是說,這個(gè)實(shí)現(xiàn)處在抽象類所定義出的繼承的等級(jí)結(jié)構(gòu)中,而由于Java語(yǔ)言的單繼承性,所以抽象類作為類型定義工具的效能大打折扣。

在這一點(diǎn)上,Java接口的優(yōu)勢(shì)就出來了,任何一個(gè)實(shí)現(xiàn)了一個(gè)Java接口所規(guī)定的方法的類都可以具有這個(gè)接口的類型,而一個(gè)類可以實(shí)現(xiàn)任意多個(gè)Java接口,從而這個(gè)類就有了多種類型。3、從第2點(diǎn)不難看出,Java接口是定義混合類型的理想工具,混合類表明一個(gè)類不僅僅具有某個(gè)主類型的行為,而且具有其他的次要行為。4、結(jié)合1、2點(diǎn)中抽象類和Java接口的各自優(yōu)勢(shì),具精典的設(shè)計(jì)模式就出來了:聲明類型的工作仍然由Java接口承擔(dān),但是同時(shí)給出一個(gè)Java抽象類,且實(shí)現(xiàn)了這個(gè)接口,而其他同屬于這個(gè)抽象類型的具體類可以選擇實(shí)現(xiàn)這個(gè)Java接口,也可以選擇繼承這個(gè)抽象類,也就是說在層次結(jié)構(gòu)中,Java接口在最上面,然后緊跟著抽象類,哈,這下兩個(gè)的最大優(yōu)點(diǎn)都能發(fā)揮到極至了。這個(gè)模式就是“缺省適配模式”。

在Java語(yǔ)言API中用了這種模式,而且全都遵循一定的命名規(guī)范:Abstract+接口名。Java接口和Java抽象類的存在就是為了用于具體類的實(shí)現(xiàn)和繼承的,如果你準(zhǔn)備寫一個(gè)具體類去繼承另一個(gè)具體類的話,那你的設(shè)計(jì)就有很大問題了。Java抽象類就是為了繼承而存在的,它的抽象方法就是為了強(qiáng)制子類必須去實(shí)現(xiàn)的。使用Java接口和抽象Java類進(jìn)行變量的類型聲明、參數(shù)是類型聲明、方法的返還類型說明,以及數(shù)據(jù)類型的轉(zhuǎn)換等。而不要用具體Java類進(jìn)行變量的類型聲明、參數(shù)是類型聲明、方法的返還類型說明,以及數(shù)據(jù)類型的轉(zhuǎn)換等。1、Java接口和Java抽象類最大的一個(gè)區(qū)別,就在于Java抽象類可以提供某些方法的部分實(shí)現(xiàn),而Java接口不可以,這大概就是Java抽象類唯一的優(yōu)點(diǎn)吧,但這個(gè)優(yōu)點(diǎn)非常有用。

如果向一個(gè)抽象類里加入一個(gè)新的具體方法時(shí),那么它所有的子類都一下子都得到了這個(gè)新方法,而Java接口做不到這一點(diǎn),如果向一個(gè)Java接口里加入一個(gè)新方法,所有實(shí)現(xiàn)這個(gè)接口的類就無法成功通過編譯了,因?yàn)槟惚仨氉屆恳粋€(gè)類都再實(shí)現(xiàn)這個(gè)方法才行,這顯然是Java接口的缺點(diǎn)。2、一個(gè)抽象類的實(shí)現(xiàn)只能由這個(gè)抽象類的子類給出,也就是說,這個(gè)實(shí)現(xiàn)處在抽象類所定義出的繼承的等級(jí)結(jié)構(gòu)中,而由于Java語(yǔ)言的單繼承性,所以抽象類作為類型定義工具的效能大打折扣。

在這一點(diǎn)上,Java接口的優(yōu)勢(shì)就出來了,任何一個(gè)實(shí)現(xiàn)了一個(gè)Java接口所規(guī)定的方法的類都可以具有這個(gè)接口的類型,而一個(gè)類可以實(shí)現(xiàn)任意多個(gè)Java接口,從而這個(gè)類就有了多種類型。3、從第2點(diǎn)不難看出,Java接口是定義混合類型的理想工具,混合類表明一個(gè)類不僅僅具有某個(gè)主類型的行為,而且具有其他的次要行為。4、結(jié)合1、2點(diǎn)中抽象類和Java接口的各自優(yōu)勢(shì),具精典的設(shè)計(jì)模式就出來了:聲明類型的工作仍然由Java接口承擔(dān),但是同時(shí)給出一個(gè)Java抽象類,且實(shí)現(xiàn)了這個(gè)接口,而其他同屬于這個(gè)抽象類型的具體類可以選擇實(shí)現(xiàn)這個(gè)Java接口,也可以選擇繼承這個(gè)抽象類,也就是說在層次結(jié)構(gòu)中,Java接口在最上面,然后緊跟著抽象類,哈,這下兩個(gè)的最大優(yōu)點(diǎn)都能發(fā)揮到極至了。這個(gè)模式就是“缺省適配模式”。

在Java語(yǔ)言API中用了這種模式,而且全都遵循一定的命名規(guī)范:Abstract+接口名。Java接口和Java抽象類的存在就是為了用于具體類的實(shí)現(xiàn)和繼承的,如果你準(zhǔn)備寫一個(gè)具體類去繼承另一個(gè)具體類的話,那你的設(shè)計(jì)就有很大問題了。Java抽象類就是為了繼承而存在的,它的抽象方法就是為了強(qiáng)制子類必須去實(shí)現(xiàn)的。使用Java接口和抽象Java類進(jìn)行變量的類型聲明、參數(shù)是類型聲明、方法的返還類型說明,以及數(shù)據(jù)類型的轉(zhuǎn)換等。而不要用具體Java類進(jìn)行變量的類型聲明、參數(shù)是類型聲明、方法的返還類型說明,以及數(shù)據(jù)類型的轉(zhuǎn)換等。如果功能與對(duì)象自身密切相關(guān),則在超類中使用抽象的基類方法.

如果該功能只是對(duì)象的輔助行為,則可使用接口.

如果該功能可被全局性地使用到其他無關(guān)的對(duì)象,則可使用接口.2.Java有哪些基本數(shù)據(jù)類型Java語(yǔ)言提供了八種基本類型:六種數(shù)字類型(四個(gè)整數(shù)型,兩個(gè)浮點(diǎn)型) 字節(jié)型byte8位(1字節(jié)) 短整型short16位(2字節(jié)) 整型int32位(4字節(jié)) 長(zhǎng)整型long64位(8字節(jié)) 單精度float32位(4字節(jié)) 雙精度double64位(8字節(jié))一種字符類型 字符型char8位還有一種布爾型 布爾型:boolean8位可存儲(chǔ)"True"和"false"3.Java中方法的重載與重寫的區(qū)別重寫Overriding是父類與子類之間多態(tài)性的一種表現(xiàn),重載Overloading是一個(gè)類中多態(tài)性的一種表現(xiàn)。重寫就是再寫一遍,重載就是再多一個(gè)。

重寫:父類里有,子類再照貓畫虎寫一個(gè)。

重載:自己類里面有,覺得不夠再寫一個(gè)。重載和重寫,這是兩個(gè)新概念,是兩個(gè)令我們?nèi)菀谆煜母拍睢?/p>

方法重載(overloadingmethod)是在一個(gè)類里面,方法名字相同,而參數(shù)不同。返回類型呢?可以相同也可以不同。

方法重寫(overidingmethod)子類不想原封不動(dòng)地繼承父類的方法,而是想作一定的修改,這就需要采用方法的重寫。方法重寫又稱方法覆蓋。

方法重載是讓類以統(tǒng)一的方式處理不同類型數(shù)據(jù)的一種手段。Java的方法重載,就是在類中可以創(chuàng)建多個(gè)方法,它們具有相同的名字,但具有不同的參數(shù)和不同的定義。調(diào)用方法時(shí)通過傳遞給它們的不同個(gè)數(shù)和類型的參數(shù)來決定具體使用哪個(gè)方法,這就是多態(tài)性。

方法重寫:在Java中,子類可繼承父類中的方法,而不需要重新編寫相同的方法。但有時(shí)子類并不想原封不動(dòng)地繼承父類的方法,而是想作一定的修改,這就需要采用方法的重寫。方法重寫又稱方法覆蓋。若子類中的方法與父類中的某一方法具有相同的方法名、返回類型和參數(shù)表,則新方法將覆蓋原有的方法。如需父類中原有的方法,可使用super關(guān)鍵字,該關(guān)鍵字引用了當(dāng)前類的父類

重寫方法的規(guī)則:

參數(shù)列表必須完全與被重寫的方法的相同,否則不能稱其為重寫而是重載.

返回的類型必須一直與被重寫的方法的返回類型相同,否則不能稱其為重寫而是重載.

訪問修飾符的限制一定要大于被重寫方法的訪問修飾符(public>protected>default>private)

重寫方法一定不能拋出新的檢查異?;蛘弑缺恢貙懛椒ㄉ昝鞲訉挿旱臋z查型異常.例如,

父類的一個(gè)方法申明了一個(gè)檢查異常IOException,在重寫這個(gè)方法是就不能拋出Exception,只能拋出IOException的子類異常,可以拋出非檢查異常.

重載的規(guī)則:

必須具有不同的參數(shù)列表;

可以有不同的返回類型,只要參數(shù)列表不同就可以了;

可以有不同的訪問修飾符;

可以拋出不同的異常;

注意,Java的方法重載要求同名的方法必須有不同的參數(shù)表,僅有返回類型不同是不足以區(qū)分兩個(gè)重載的方法。重寫方法只能存在于具有繼承關(guān)系中,重寫方法只能重寫父類非私有的方法。

下面分別舉一個(gè)例子來說明方法重載:

publicclassTestOverLoad{

publicstaticvoidmain(String[]args){

Testtest=newTest();

test.print(null);

}

}

classTest{

publicvoidprint(Stringsome){

System.out.println("Stringversionprint");

}

publicvoidprint(Objectsome){

System.out.println("Objectversionprint");

}

}

該程序輸出的結(jié)果是Stringversionprint。這個(gè)題目明顯是考察方法重載的,重載使得java的類可以有具有多個(gè)相同方法名的方法。編譯器可以通過方法的參數(shù)的類型和個(gè)數(shù)來區(qū)分他們。4.解析Java中Strings=newString(“abc”);創(chuàng)建了幾個(gè)String對(duì)象?知道在java中除了8中基本類型外,其他的都是類對(duì)象以及其引用。所以"xyz"在java中它是一個(gè)String對(duì)象.對(duì)于string類對(duì)象來說他的對(duì)象值是不能修改的,也就是具有不變性。

看:

String

s="Hello";

s="Java";

String

s1="Hello";

String

s2=newString("Hello");

s所引用的string對(duì)象不是被修改了嗎?之前所說的不變性,去那里了?。?/p>

你別著急,讓我告訴你說發(fā)生了什么事情:

在jvm的工作過程中,會(huì)創(chuàng)建一片的內(nèi)存空間專門存入string對(duì)象。我們把這片內(nèi)存空間叫做string池。

String

s="Hello";當(dāng)jvm看到"Hello",在string池創(chuàng)建string對(duì)象存儲(chǔ)它,并將他的引用返回給s。

s="Java",當(dāng)jvm看到"Java",在string池創(chuàng)建新的string對(duì)象存儲(chǔ)它,再把新建的string對(duì)象的引用返回給s。而原先的"Hello"仍然在string池內(nèi)。沒有消失,他是不能被修改的。

所以我們僅僅是改變了s的引用,而沒有改變他所引用的對(duì)象,因?yàn)閟tring對(duì)象的值是不能被修改的。

String

s1="Hello";jvm首先在string池內(nèi)里面看找不找到字符串"Hello",找到,返回他的引用給s1,否則,創(chuàng)建新的string對(duì)象,放到string池里。這里由于s="Hello"了,對(duì)象已經(jīng)被引用,所以依據(jù)規(guī)則s和s1都是引用同一個(gè)對(duì)象。所以s==s1將返回true。(==,對(duì)于非基本類型,是比較兩引用是否引用內(nèi)存中的同一個(gè)對(duì)象)

String

s2=String("Hello");jvm首先在string池內(nèi)里面看找不找到字符串"Hello",找到,不做任何事情,否則,創(chuàng)建新的string對(duì)象,放到string池里面。由于遇到了new,還會(huì)在內(nèi)存上(不是string池里面)創(chuàng)建string對(duì)象存儲(chǔ)"Hello",并將內(nèi)存上的(不是string池內(nèi)的)string對(duì)象返回給s2。所以s==s2將返回false,不是引用同一個(gè)對(duì)象。

好現(xiàn)在我們看題目:

String

s=new

String("xyz");

首先在string池內(nèi)找,找到?不創(chuàng)建string對(duì)象,否則創(chuàng)建,這樣就一個(gè)string對(duì)象

遇到new運(yùn)算符號(hào)了,在內(nèi)存上創(chuàng)建string對(duì)象,并將其返回給s,又一個(gè)對(duì)象

所以總共是2個(gè)對(duì)象

Strings=newString(“abc”);創(chuàng)建了幾個(gè)String對(duì)象?答案是2個(gè)。為什么?下面講

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論