Java面向?qū)ο蠡A(chǔ)2_第1頁
Java面向?qū)ο蠡A(chǔ)2_第2頁
Java面向?qū)ο蠡A(chǔ)2_第3頁
Java面向?qū)ο蠡A(chǔ)2_第4頁
Java面向?qū)ο蠡A(chǔ)2_第5頁
已閱讀5頁,還剩52頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

Java面向?qū)ο蟾住怖m(xù)〕類的繼承final關(guān)鍵字抽象類接口多態(tài)包4.1類的繼承4.2Final關(guān)鍵字4.3抽象類和接口4.4多態(tài)4.5包4.6訪問控制4.1類的繼承4.1.1繼承的概念程序中,繼承描述的是事物之間的所屬關(guān)系,通過繼承可以使多種事物之間形成一種關(guān)系體系。在Java中,類的繼承是指在一個(gè)現(xiàn)有類的根底上去構(gòu)建一個(gè)新的類,構(gòu)建出來的新類被稱作子類,現(xiàn)有類被稱作父類,子類會(huì)自動(dòng)擁有父類所有可繼承的屬性和方法。在程序中,如果想聲明一個(gè)類繼承另一個(gè)類,需要使用extends關(guān)鍵字,接下來通過一個(gè)案例來學(xué)習(xí)子類是如何繼承父類的。4.1類的繼承4.1.1繼承的概念程序中,繼承描述的是事物之間的所屬關(guān)系,通過繼承可以使多種事物之間形成一種關(guān)系體系。在Java中,類的繼承是指在一個(gè)現(xiàn)有類的根底上去構(gòu)建一個(gè)新的類,構(gòu)建出來的新類被稱作子類,現(xiàn)有類被稱作父類,子類會(huì)自動(dòng)擁有父類所有可繼承的屬性和方法。在程序中,如果想聲明一個(gè)類繼承另一個(gè)類,需要使用extends關(guān)鍵字,接下來通過一個(gè)案例來學(xué)習(xí)子類是如何繼承父類的。4.1類的繼承4.1類的繼承4.1.1繼承的概念在類的繼承中,需要注意一些問題,具體如下:1、在Java中,類只支持單繼承,不允許多重繼承,也就是說一個(gè)類只能有一個(gè)直接父類,例如下面這種情況是不合法的。2、多個(gè)類可以繼承一個(gè)父類,例如下面這種情況是允許的。4.1類的繼承4.1.1繼承的概念在類的繼承中,需要注意一些問題,具體如下:3、在Java中,多層繼承是可以的,即一個(gè)類的父類可以再去繼承另外的父類,例如C類繼承自B類,而B類又可以去繼承A類,這時(shí),C類也可稱作A類的子類。下面這種情況是允許的。4.1類的繼承重寫父類方法在繼承關(guān)系中,子類會(huì)自動(dòng)繼承父類中定義的方法,但有時(shí)在子類中需要對(duì)繼承的方法進(jìn)行一些修改,即對(duì)父類的方法進(jìn)行重寫。需要注意的是,在子類中重寫的方法需要和父類被重寫的方法具有相同的方法名、參數(shù)列表以及返回值類型。4.1類的繼承重寫父類方法從例程4-3的運(yùn)行結(jié)果可以看出,當(dāng)子類重寫父類的方法后,子類對(duì)象將無法訪問父類被重寫的方法,為了解決這個(gè)問題,在Java中專門提供了一個(gè)super關(guān)鍵字用于訪問父類的成員。例如訪問父類的成員變量、成員方法和構(gòu)造方法。接下來分兩種情況來學(xué)習(xí)一下super關(guān)鍵字的具體用法。1、使用super關(guān)鍵字調(diào)用父類的成員變量和成員方法。具體格式如下:4.1類的繼承4.1類的繼承重寫父類方法2、使用super關(guān)鍵字調(diào)用父類的構(gòu)造方法。具體格式如下:4.1類的繼承重寫父類方法例程4-4中在實(shí)例化Dog對(duì)象時(shí)一定會(huì)調(diào)用Dog類的構(gòu)造方法。從運(yùn)行結(jié)果可以看出,Dog類的構(gòu)造方法被調(diào)用時(shí)父類的構(gòu)造方法也被調(diào)用了。需要注意的是,通過super調(diào)用父類構(gòu)造方法的代碼必須位于子類構(gòu)造方法的第一行,并且只能出現(xiàn)一次。將例程4-4第11行代碼去掉,再次編譯程序會(huì)報(bào)錯(cuò):4.1類的繼承重寫父類方法出錯(cuò)的原因是,在子類的構(gòu)造方法中一定會(huì)調(diào)用父類的某個(gè)構(gòu)造方法。這時(shí)可以在子類的構(gòu)造方法中通過super指定調(diào)用父類的哪個(gè)構(gòu)造方法,如果沒有指定,在實(shí)例化子類對(duì)象時(shí),會(huì)自動(dòng)調(diào)用父類無參的構(gòu)造方法。為了解決上述程序的編譯錯(cuò)誤,可以在子類中顯示地調(diào)用父類中已有的構(gòu)造方法,當(dāng)然也可以選擇在父類中定義無參的構(gòu)造方法,現(xiàn)將例程4-4中的Animal類進(jìn)行修改,如例程4-5所示。4.2final關(guān)鍵字final關(guān)鍵字可用于修飾類、變量和方法,它有“這是無法改變的〞或者“最終〞的含義,因此被final修飾的類、變量和方法將具有以下特性:1、final修飾的類不能被繼承。2、final修飾的方法不能被子類重寫。3、final修飾的變量〔成員變量和局部變量〕是常量,只能賦值一次。4.2final關(guān)鍵字4.2.1final關(guān)鍵字修飾類Java中的類被final關(guān)鍵字修飾后,該類將不可以被繼承,也就是不能夠派生子類。接下來通過一個(gè)案例來驗(yàn)證,如例程4-6所示。4.2final關(guān)鍵字4.2.2final關(guān)鍵字修飾方法當(dāng)一個(gè)類的方法被final關(guān)鍵字修飾后,這個(gè)類的子類將不能重寫該方法。接下來通過一個(gè)案例來驗(yàn)證,如例程4-7所示。這是因?yàn)锳nimal類的shout()方法被final所修飾。由此可見,被final關(guān)鍵字修飾的方法為最終方法,子類不能對(duì)該方法進(jìn)行重寫。正是由于final的這種特性,當(dāng)在父類中的定義某個(gè)方法時(shí),如果不希望被子類重寫,就可以使用final關(guān)鍵字修飾該方法。4.2final關(guān)鍵字這是因?yàn)槭褂胒inal關(guān)鍵字修飾成員變量時(shí),虛擬機(jī)不會(huì)對(duì)其進(jìn)行初始化。因此使用final修飾成員變量時(shí),需要在定義變量的同時(shí)賦予一個(gè)初始值,下面將第2行代碼修改為:finalStringname="李芳";//為final關(guān)鍵字修飾的name屬性賦值4.3抽象類和接口4.3.1抽象類當(dāng)定義一個(gè)類時(shí),常常需要定義一些方法來描述該類的行為特征,但有時(shí)這些方法的實(shí)現(xiàn)方式是無法確定的。針對(duì)上面描述的情況,Java允許在定義方法時(shí)不寫方法體,不包含方法體的方法為抽象方法,抽象方法必須使用abstract關(guān)鍵字來修飾,具體例如如下:4.3抽象類和接口4.3.1抽象類當(dāng)一個(gè)類中包含了抽象方法,該類必須使用abstract關(guān)鍵字來修飾,使用abstract關(guān)鍵字修飾的類為抽象類,具體例如如下:4.3抽象類和接口4.3.1抽象類在定義抽象類時(shí)需要注意,包含抽象方法的類必須聲明為抽象類,但抽象類可以不包含任何抽象方法,只需使用abstract關(guān)鍵字來修飾即可。另外,抽象類是不可以被實(shí)例化的,因?yàn)槌橄箢愔杏锌赡馨橄蠓椒ǎ橄蠓椒ㄊ菦]有方法體的,不可以被調(diào)用。如果想調(diào)用抽象類中定義的方法,那么需要?jiǎng)?chuàng)立一個(gè)子類,在子類中將抽象類中的抽象方法進(jìn)行實(shí)現(xiàn)。4.3抽象類和接口4.3.2接口如果一個(gè)抽象類中的所有方法都是抽象的,那么可以將這個(gè)類用另外一種方式來定義,即接口。在定義接口時(shí),需要使用interface關(guān)鍵字來聲明,具體例如如下:從例如中會(huì)發(fā)現(xiàn)抽象方法breathe()并沒有使用abstract關(guān)鍵字來修飾,這是因?yàn)榻涌谥卸x的方法和變量都包含一些默認(rèn)修飾符。接口中定義的方法默認(rèn)使用“publicabstract〞來修飾,即抽象方法。接口中的變量默認(rèn)使用“publicstaticfinal〞來修飾,即全局常量。4.3抽象類和接口4.3.2接口由于接口中的方法都是抽象方法,因此不能通過實(shí)例化對(duì)象的方式來調(diào)用接口中的方法。此時(shí)需要定義一個(gè)類,并使用implements關(guān)鍵字實(shí)現(xiàn)接口中所有的方法。接下來通過一個(gè)案例來學(xué)習(xí),如例程4-11所示。4.3抽象類和接口4.3.2接口例程4-11演示的是類與接口之間的實(shí)現(xiàn)關(guān)系,在程序中,還可以定義一個(gè)接口使用extends關(guān)鍵字去繼承另一個(gè)接口,接下來對(duì)例程4-11稍加修改,演示接口之間的繼承關(guān)系,修改后的代碼如例4-12所示。4.3抽象類和接口4.3.2接口1、接口中的方法都是抽象的,不能實(shí)例化對(duì)象。2、當(dāng)一個(gè)類實(shí)現(xiàn)接口時(shí),如果這個(gè)類是抽象類,那么實(shí)現(xiàn)接口中的局部方法即可,否那么需要實(shí)現(xiàn)接口中的所有方法。3、一個(gè)類通過implements關(guān)鍵字實(shí)現(xiàn)接口時(shí),可以實(shí)現(xiàn)多個(gè)接口,被實(shí)現(xiàn)的多個(gè)接口之間要用逗號(hào)隔開。具體例如如下:4.3抽象類和接口4.3.2接口4、一個(gè)接口可以通過extends關(guān)鍵字繼承多個(gè)接口,接口之間用逗號(hào)隔開。具體例如如下:4.3抽象類和接口4.3.2接口5、一個(gè)類在繼承另一個(gè)類的同時(shí)還可以實(shí)現(xiàn)接口,此時(shí),extends關(guān)鍵字必須位于implements關(guān)鍵字 之前。具體例如如下:4.4多態(tài)4.4.1多態(tài)概述Java引用變量有兩個(gè)類型:一個(gè)是編譯時(shí)的類型,一個(gè)是運(yùn)行時(shí)的類型,編譯時(shí)的類型由聲明該變量時(shí)使用的類型決定,運(yùn)行時(shí)的類型由實(shí)際賦給該變量的對(duì)象決定。如果編譯時(shí)類型和運(yùn)行時(shí)的類型不一致,這就有可能出現(xiàn)所謂的多態(tài)。兩個(gè)相同類型的引用變量,由于它們實(shí)際引用的對(duì)象的類型不同,當(dāng)它們調(diào)用同名方法時(shí),可能呈現(xiàn)出多種行為特征,這就是多態(tài)。4.4多態(tài)4.4.1多態(tài)概述在設(shè)計(jì)一個(gè)方法時(shí),通常希望該方法具備一定的通用性。在同一個(gè)方法中,這種由于參數(shù)類型不同而導(dǎo)致執(zhí)行效果各異的現(xiàn)象就是多態(tài)。在Java中為了實(shí)現(xiàn)多態(tài),允許使用一個(gè)父類類型的變量來引用一個(gè)子類類型的對(duì)象,根據(jù)被引用子類對(duì)象特征的不同,得到不同的運(yùn)行結(jié)果,接下來通過一個(gè)案例來演示,如例程4-13所示。4.4多態(tài)4.4.2對(duì)象的類型轉(zhuǎn)換在多態(tài)的學(xué)習(xí)中,涉及到將子類對(duì)象當(dāng)做父類類型使用的情況,例如下面兩行代碼:將子類對(duì)象當(dāng)做父類使用時(shí)不需要任何顯式地聲明,需要注意的是,此時(shí)不能通過父類變量去調(diào)用子類中某些方法。4.4多態(tài)4.4多態(tài)4.4.2對(duì)象的類型轉(zhuǎn)換將例程4-14中的animalShout()方法進(jìn)行修改,具體代碼如下:4.4多態(tài)4.4.2對(duì)象的類型轉(zhuǎn)換需要注意的是,在進(jìn)行類型轉(zhuǎn)換時(shí)也可能出現(xiàn)錯(cuò)誤,例如在例程4-14中調(diào)用animalShout()方法時(shí)傳入一個(gè)Dog類型的對(duì)象,這時(shí)進(jìn)行強(qiáng)制類型轉(zhuǎn)換就會(huì)出現(xiàn)出錯(cuò),如例程4-15所示。出錯(cuò)的原因是,在調(diào)用animalShout()方法時(shí),傳入一個(gè)Dog對(duì)象,在強(qiáng)制類型轉(zhuǎn)換時(shí),Animal類型的變量無法強(qiáng)轉(zhuǎn)為Cat類型。4.4多態(tài)4.4.2對(duì)象的類型轉(zhuǎn)換針對(duì)這種情況,Java提供了一個(gè)關(guān)鍵字instanceof,它可以判斷一個(gè)對(duì)象是否為某個(gè)類(或接口)的實(shí)例或者子類實(shí)例,語法格式如下接下來對(duì)例程4-15的animalShout()方法進(jìn)行修改,具體代碼如下:多態(tài)的優(yōu)點(diǎn)?提高了代碼的可擴(kuò)展性和維護(hù)性多態(tài)的缺點(diǎn)?不能直接使用子類的特有功能如何克服?向下轉(zhuǎn)型〔要兼容〕我們?cè)陔娮邮袌?chǎng)隨便挑選了一塊計(jì)算機(jī)主板和一塊PCI卡〔網(wǎng)卡、聲卡等〕,結(jié)果,這塊PCI卡能夠很好地利用到這塊主板上,雖然主板廠商和PCI卡廠商不是同一家,但他們都知道同一個(gè)標(biāo)準(zhǔn)——PCI標(biāo)準(zhǔn)。4.4.4匿名內(nèi)部類前面多態(tài)的講解中,如果方法的參數(shù)被定義為一個(gè)接口類型,那么就需要定義一個(gè)類來實(shí)現(xiàn)接口,并根據(jù)該類進(jìn)行對(duì)象實(shí)例化。除此之外,還可以使用匿名內(nèi)部類來實(shí)現(xiàn)接口。4.4.4匿名內(nèi)部類首先看一下匿名內(nèi)部類的格式,具體如下。接下來對(duì)例程4-18進(jìn)行改寫,如例程4-19所示。4.4.4匿名內(nèi)部類1、在調(diào)用animalShout()方法時(shí),在方法的參數(shù)位置寫上newAnimal(){},這相當(dāng)于創(chuàng)立了一個(gè)實(shí)例對(duì)象,并將對(duì)象作為參數(shù)傳給animalShout()方法。在newAnimal()后面有一對(duì)大括號(hào),表示創(chuàng)立的對(duì)象為Animal的子類實(shí)例,該子類是匿名的。具體代碼如下所示:4.4.4匿名內(nèi)部類4.5包(package)4.5.1包的定義與使用為了便于對(duì)硬盤上的文件進(jìn)行管理,通常都會(huì)將文件分目錄進(jìn)行存放。同理,在程序開發(fā)中,也需要將編寫的類分目錄存放便于管理,為此,Java引入了包(package)機(jī)制,程序可以通過聲明包的方式對(duì)Java類定義目錄。作用:對(duì)類進(jìn)行分類管理,區(qū)分同名類語法:package包名;多級(jí)包名,用.分隔

packageabc;package.ccnu.cs;4.5包(package)當(dāng)編譯一個(gè)聲明了包的Java源文件,需要使用命令生成與包名對(duì)應(yīng)的目錄:其中,“-d〞用來指定生成的類文件的位置,“.〞表示在當(dāng)前目錄,整行命令表示生成帶包目錄的.class文件并存放在當(dāng)前目錄下,當(dāng)然,生成的類文件還可以存放在其它目錄下,這時(shí)只需要將“.〞用其它路徑替換即可。4.5包(package)4.5.1包的定義與使用接下來以HelloWorld為例,分步驟講解如何使用包機(jī)制管理Java的類文件。1、編寫HelloWorld類,在類名之前聲明當(dāng)前類所在的包為“cn.ccnu〞。4.5包(package)4.5.1包的定義與使用2、javac–d.編譯源文件,在當(dāng)前目錄下查看包名“cn.ccnu〞對(duì)應(yīng)的“cn\ccnu〞目錄,發(fā)現(xiàn)該目錄下存放了HelloWorld.class文件。4.5包(package)4.5.1包的定義與使用3、使用“javacn.ccnu.HelloWorld〞命令運(yùn)行class文件,需要注意的是,在運(yùn)行.class文件時(shí),需要跟上包名,運(yùn)行結(jié)果如圖4-38所示。4.5包(package)4.5.2import語句import關(guān)鍵字解決當(dāng)不同包下的類之間互相訪問的時(shí)候,每次都需要加包的全名,很麻煩!Java的核心類主要放在java這個(gè)包以及其子包下,Java擴(kuò)展的大局部類都放在javax包以及其子包下。Java語言中的常用包:java.lang:包含Java語言的核心類,如String、Math、System和Thread類等,使用這個(gè)包中的類無須使用import語句導(dǎo)入,系統(tǒng)會(huì)自動(dòng)導(dǎo)入這個(gè)包下的所有類。java.util:包含Java中大量工具類、集合類等,例如Arrays、List、Set等。:包含Java網(wǎng)絡(luò)編程相關(guān)的類和接口。java.io:包含了Java輸入、輸出有關(guān)的類和接口。java.awt:包含用于構(gòu)建圖形界面(GUI)的相關(guān)類和接口。4.5包(package)4.5.3給Java應(yīng)用打包jar文件的全稱是JavaArchiveFile,它是一種壓縮文件,獨(dú)立于任何操作系統(tǒng)平臺(tái),習(xí)慣上也將jar文件稱為jar包。在使用jar包時(shí),只需要在classpath環(huán)境變量中包含這個(gè)jar文件的路徑,Java虛擬機(jī)就能自動(dòng)在內(nèi)存中解壓這個(gè)jar文件,根據(jù)包名所對(duì)應(yīng)的目錄結(jié)構(gòu)去尋找所需要的類。4.5包(package)4.5.3給Java應(yīng)用打包給Java應(yīng)用打包有很多好處:平安:可以對(duì)jar文件進(jìn)行數(shù)字簽名,讓能識(shí)別數(shù)字簽名的用戶使用。節(jié)省空間:當(dāng)把.class文件打成jar壓縮文件,會(huì)節(jié)省空間,如果將jar文件在網(wǎng)絡(luò)上傳輸,也會(huì)加快傳輸速率。可移植性:只要有Java虛擬機(jī),jar包就可以在任何平臺(tái)上運(yùn)行。4.5包(package)4.5.3給Java應(yīng)用打包接下來在命令行窗口輸入jar命令,查看jar命令的用法幫助。4.5包(package)4.5.3給Java應(yīng)用打包壓縮jar文件以及運(yùn)行jar包。1、翻開命令提示符,進(jìn)入D:\cn\ccnu目錄,輸入命令-c代表創(chuàng)立歸檔的文件-v代表在標(biāo)準(zhǔn)輸出中生成詳細(xì)輸出-f代表指

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(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)論