版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
Java語(yǔ)言09-10學(xué)年度第一學(xué)期08計(jì)算機(jī)王德力第3章面向?qū)ο竺嫦驅(qū)ο蟮娜齻€(gè)特征:封裝、繼承、多態(tài)3.1
類(lèi)與對(duì)象
面向?qū)ο蟮木幊趟枷肓D使在計(jì)算機(jī)語(yǔ)言中對(duì)事物的描述與現(xiàn)實(shí)世界中該事物的本來(lái)面目盡可能地一致,類(lèi)(class)和對(duì)象(object)就是面向?qū)ο蠓椒ǖ暮诵母拍?。?lèi)是對(duì)某一類(lèi)事物的描述,是抽象的、概念上的定義;對(duì)象是實(shí)際存在的該類(lèi)事物的個(gè)體,因而也稱(chēng)實(shí)例。如:人(類(lèi)),張三(對(duì)象),其中張三具有人的特性和行為。面向?qū)ο蟪绦蛟O(shè)計(jì)的重點(diǎn)是類(lèi)的設(shè)計(jì),而不是對(duì)象的設(shè)計(jì)。
3.1.1類(lèi)的定義
類(lèi)可以將數(shù)據(jù)和函數(shù)封裝在一起,其中數(shù)據(jù)表示類(lèi)的屬性,函數(shù)表示類(lèi)的行為。定義類(lèi)就是要定義類(lèi)的屬性與行為(方法)。如:
classPerson{
intage;voidshout(){
System.out.println(“myageis:”+age);}}
其中,定義了一個(gè)Person類(lèi),該類(lèi)有一個(gè)屬性age,一個(gè)方法shout。類(lèi)的屬性也叫類(lèi)的成員變量,類(lèi)的方法也叫類(lèi)的成員函數(shù)。一個(gè)類(lèi)中的方法可以直接訪(fǎng)問(wèn)同類(lèi)中的任何成員(包括成員變量和成員函數(shù))。3.1.2對(duì)象的產(chǎn)生與使用要想實(shí)現(xiàn)類(lèi)的屬性與行為,必須創(chuàng)建具體的對(duì)象。要?jiǎng)?chuàng)建新的對(duì)象,需要使用new關(guān)鍵字和想要?jiǎng)?chuàng)建對(duì)象的類(lèi)名,如:
Personp1=newPerson();
等號(hào)左邊以類(lèi)名Person作為變量類(lèi)型定義了一個(gè)變量p1,來(lái)指向等號(hào)右邊通過(guò)new關(guān)鍵字創(chuàng)建的一個(gè)Person類(lèi)的對(duì)象實(shí)例對(duì)象,變量p1就是對(duì)象的引用句柄,對(duì)象的引用句柄是在棧中分配的一個(gè)變量,對(duì)象本身是在堆中分配的。當(dāng)一個(gè)對(duì)象被創(chuàng)建時(shí),會(huì)對(duì)其中各種類(lèi)型的成員變量自動(dòng)進(jìn)行初始化賦值。比如數(shù)值為0,字符為空,布爾型為假。創(chuàng)建新的對(duì)象后,就可以用“對(duì)象名.對(duì)象成員”的格式,來(lái)訪(fǎng)問(wèn)對(duì)象的成員(屬性和方法)。例:TestPerson.java
3.1.3對(duì)象的比較有兩種方式可用于對(duì)象間的比較,它們是“==”與equals()方法,“==”操作符用于比較兩個(gè)變量的值是否相等,equals()方法用于比較兩個(gè)對(duì)象的內(nèi)容是否一致。例:Compare.java3.1.4匿名對(duì)象創(chuàng)建完對(duì)象,在調(diào)用該對(duì)象的方法時(shí),也可以不定義對(duì)象的句柄,而直接調(diào)用這個(gè)對(duì)象的方法。這樣的對(duì)象叫做匿名對(duì)象,如:newPerson().shout();
這句代碼沒(méi)有產(chǎn)生任何句柄,而是直接用new關(guān)鍵創(chuàng)建了Person類(lèi)的對(duì)象并直接調(diào)用它的shout()方法。使用匿名對(duì)象的兩種情況:(1)如果一個(gè)對(duì)象只需要進(jìn)行一次方法調(diào)用,那么就可以使用匿名對(duì)象。(2)將匿名對(duì)象作為實(shí)參傳遞一個(gè)函數(shù)調(diào)用,如:
getSomeOne(newPerson());3.1.5實(shí)現(xiàn)類(lèi)的封裝性 在定義一個(gè)類(lèi)的成員(包括變量和方法)時(shí),使用private關(guān)鍵字說(shuō)明這個(gè)成員的訪(fǎng)問(wèn)權(quán)限,這個(gè)成員成了類(lèi)的私有成員,只能被這個(gè)類(lèi)的其它成員方法調(diào)用,而不能被其它的類(lèi)訪(fǎng)問(wèn)。例:TestPerson2.javapublic為公共的,可以在任意類(lèi)中訪(fǎng)問(wèn)這類(lèi)成員。為了實(shí)現(xiàn)良好的封裝性,通常將類(lèi)的成員變量聲明為private,再通過(guò)public的方法來(lái)對(duì)這個(gè)變量進(jìn)行訪(fǎng)問(wèn)。這種方式被稱(chēng)為封裝,實(shí)現(xiàn)封裝可以達(dá)到以下目的:隱藏類(lèi)的實(shí)現(xiàn)細(xì)節(jié);讓使用者只能通過(guò)事先定制好的方法來(lái)訪(fǎng)問(wèn)數(shù)據(jù),可以方便地加入控制邏輯,限制對(duì)屬性的不合理操作;便于修改,增強(qiáng)代碼的可維護(hù)性;可進(jìn)行數(shù)據(jù)檢查。3.2構(gòu)造函數(shù)3.2.1構(gòu)造函數(shù)的定義與作用構(gòu)造方法在程序設(shè)計(jì)中非常有用,它可以為類(lèi)的成員變量進(jìn)行初始化工作,當(dāng)一個(gè)類(lèi)的實(shí)例對(duì)象剛產(chǎn)生時(shí),這個(gè)類(lèi)的構(gòu)造方法就會(huì)自動(dòng)調(diào)用,我們可以在這個(gè)方法中加入要完成初始化工作的代碼。構(gòu)造方法不同于一般方法:
它具有與類(lèi)相同的名稱(chēng)它不含返回值它不能在方法中用return語(yǔ)句返回一個(gè)值例:PersonConstru.java
3.2.2構(gòu)造方法的重載構(gòu)造方法也可以被重載。例:PersonConstru2.java
在Java的每個(gè)類(lèi)里都至少有一個(gè)構(gòu)造方法,如果程序員沒(méi)有在一個(gè)類(lèi)里定義構(gòu)造方法,系統(tǒng)會(huì)自動(dòng)為這個(gè)類(lèi)產(chǎn)生一個(gè)默認(rèn)的構(gòu)造方法,這個(gè)默認(rèn)構(gòu)造方法沒(méi)有參數(shù),在其方法體中也沒(méi)有任何代碼。由于系統(tǒng)提供的默認(rèn)構(gòu)造方法往往不能滿(mǎn)足需求,我們可以自己定義類(lèi)的構(gòu)造方法來(lái)滿(mǎn)足需要,一旦編程者為該類(lèi)定義了構(gòu)造方法,系統(tǒng)就不再提供默認(rèn)的構(gòu)造方法了。3.3this引用句柄例:TestThis.java問(wèn)題:如何在func2中調(diào)用a1的func1?答:this.func1();this關(guān)鍵字在java程序里的作用和它的詞義很接近,它在函數(shù)內(nèi)部就是這個(gè)函數(shù)所屬的對(duì)象的引用變量。在成員方法中,對(duì)訪(fǎng)問(wèn)的同類(lèi)中成員前不加this引用,效果是一樣的,如上例:func1();每個(gè)成員方法內(nèi)部,都有一個(gè)this引用變量,指向調(diào)用這個(gè)方法的對(duì)象。有些情況下,必須用this關(guān)鍵字(1)想通過(guò)構(gòu)造方法將外部傳入的參數(shù)賦值給類(lèi)成員變量,構(gòu)造方法的形式參數(shù)名稱(chēng)與類(lèi)的成員變量名相同。如:
classA{Stringname; publicA(Stringname) {=name;}}不能用name=name的形式,因?yàn)樾问絽?shù)是方法內(nèi)部的一個(gè)局部變量,成員變量與方法中的局部變量同名時(shí),在該方法中對(duì)同名變量的訪(fǎng)問(wèn)是指那個(gè)局部變量。(2)假設(shè)有一個(gè)容器類(lèi)和一個(gè)部件類(lèi),在容器類(lèi)的某個(gè)方法中要?jiǎng)?chuàng)建部件類(lèi)的實(shí)例對(duì)象,而部件類(lèi)的構(gòu)造方法要接收一個(gè)代表其所在容器的參數(shù),程序代碼為:
classContainer{Componentcomp;publicvoidaddComponent(){comp=newComponent(this);}}classComponent{ContainermyContainer;publicComponent(Containerc){myContainer=c;}}
這就是通過(guò)this引用把當(dāng)前的對(duì)象作為一個(gè)參數(shù)傳遞給其他的方法和構(gòu)造方法的應(yīng)用。(3)構(gòu)造方法是在產(chǎn)生對(duì)象是被java系統(tǒng)自動(dòng)調(diào)用的,我們不能在程序中像調(diào)用其他方法一樣去調(diào)用構(gòu)造方法。但我們可以在一個(gè)構(gòu)造方法里調(diào)用其他重載的構(gòu)造方法,不是用構(gòu)造方法名,而是用this(參數(shù)表)的形式,根據(jù)其中的參數(shù)列表,選擇相應(yīng)的構(gòu)造方法。例:
publicclassPerson{Stringname;
intage;publicPerson(Stringname){=name;}publicPerson(String
name,intage){this(name);this.age=age;}}
在類(lèi)Person的第二個(gè)構(gòu)造方法中,通過(guò)this(…)調(diào)用,執(zhí)行第一個(gè)構(gòu)造方法中的代碼。3.4函數(shù)的參數(shù)傳遞3.4.1基本數(shù)據(jù)類(lèi)型的參數(shù)傳遞方法的參數(shù)傳遞過(guò)程中方法的形式參數(shù)相當(dāng)于方法中定義的局部變量,方法調(diào)用結(jié)束時(shí)也就釋放了,不會(huì)影響到主程序中同名的局部變量.
例:PassValue.java3.4.2引用數(shù)據(jù)類(lèi)型的參數(shù)傳遞例:PassRef.java對(duì)象的引用變量并不是對(duì)象本身,它們只是對(duì)象的句柄(名稱(chēng)),就好象一個(gè)人可以有多個(gè)名稱(chēng)一樣,一個(gè)對(duì)象可以有多個(gè)句柄。Java語(yǔ)言在給被調(diào)用方法的參數(shù)賦值時(shí),只采用傳值的方式。所以,基本數(shù)據(jù)類(lèi)型傳遞的是該數(shù)據(jù)的本身,引用數(shù)據(jù)類(lèi)型傳遞的也是這個(gè)變量的值本身,即對(duì)象的引用(句柄),而非對(duì)象本身,通過(guò)方法調(diào)用,可以改變對(duì)象的內(nèi)容。3.5static關(guān)鍵字3.5.1靜態(tài)變量當(dāng)我們編寫(xiě)一個(gè)類(lèi)時(shí),其實(shí)就是在描述其對(duì)象的屬性和行為,而并沒(méi)有產(chǎn)生實(shí)質(zhì)上的對(duì)象,只有通過(guò)new關(guān)鍵字才會(huì)產(chǎn)生出對(duì)象,這時(shí)系統(tǒng)才會(huì)分配內(nèi)存空間給對(duì)象,其方法才可以供外部調(diào)用。有時(shí)候,我們希望無(wú)論是否產(chǎn)生了對(duì)象或無(wú)論產(chǎn)生了多少對(duì)象的情況下,某些特定的數(shù)據(jù)在內(nèi)存空間中只有一份,可以通過(guò):類(lèi)名.成員變量的形式訪(fǎng)問(wèn)它,要實(shí)現(xiàn)這個(gè)效果,只需要在類(lèi)中定義的變量前面加上static關(guān)鍵字即可,我們稱(chēng)這種變量為靜態(tài)變量。靜態(tài)變量在某種程度上與其它語(yǔ)言的全局變量類(lèi)似,如果不是私有的就可以在類(lèi)的外部進(jìn)行訪(fǎng)問(wèn),此時(shí)不需要產(chǎn)生類(lèi)的實(shí)例對(duì)象,只需類(lèi)名就可以引用。例:TestChinese.java用static標(biāo)識(shí)符修飾的變量,它們?cè)陬?lèi)被載入時(shí)創(chuàng)建,只要類(lèi)存在,static變量就存在。由于靜態(tài)成員變量能被各實(shí)例對(duì)象所共享,我們可以用它來(lái)實(shí)現(xiàn)一些特殊效果,如統(tǒng)計(jì)產(chǎn)生對(duì)象數(shù):classA{privatestaticintcount=0;publicA(){count=count+1;}}3.5.2靜態(tài)方法我們有時(shí)也希望不必創(chuàng)建對(duì)象就可以調(diào)用某個(gè)方法,換句話(huà)說(shuō)也就是使該方法不必和對(duì)象綁在一起。要實(shí)現(xiàn)這個(gè)效果,只需要在類(lèi)中定義的方法前加上static關(guān)鍵字即可,我們稱(chēng)這種方法為靜態(tài)成員方法。同靜態(tài)成員變量一樣,可以用類(lèi)名直接訪(fǎng)問(wèn)靜態(tài)成員方法,也可以用類(lèi)的實(shí)例對(duì)象來(lái)訪(fǎng)問(wèn)靜態(tài)成員方法,還可以在類(lèi)的非靜態(tài)的成員方法中象訪(fǎng)問(wèn)其它非靜態(tài)方法一樣去訪(fǎng)問(wèn)這個(gè)靜態(tài)方法,如:
TestChinese2.java類(lèi)的靜態(tài)成員經(jīng)常被稱(chēng)為“類(lèi)成員”,對(duì)于靜態(tài)成員變量,我們叫做類(lèi)屬性,對(duì)于靜態(tài)成員方法,我們叫類(lèi)方法。采用static關(guān)鍵字說(shuō)明類(lèi)的屬性和方法不屬于類(lèi)的某個(gè)實(shí)例對(duì)象,在前面用到的System.out.println()語(yǔ)句,其中,System是一個(gè)類(lèi)名,out是System類(lèi)的一個(gè)靜態(tài)成員變量,println()方法則是out所引用的對(duì)象的方法。在使用類(lèi)的靜態(tài)方法時(shí),要注意以下幾點(diǎn):(1)在靜態(tài)方法里只能直接調(diào)用同類(lèi)中其它的靜態(tài)成員(包括變量和方法),而不能直接訪(fǎng)問(wèn)類(lèi)中的非靜態(tài)成員。因?yàn)閷?duì)于非靜態(tài)的方法和變量,需要先創(chuàng)建類(lèi)的實(shí)例對(duì)象后才可使用,而靜態(tài)方法在使用前不用創(chuàng)建任何對(duì)象。(2)靜態(tài)方法不能以任何方式引用this和super關(guān)鍵字。(3)main()方法是靜態(tài)的,因此JVM在執(zhí)行main方法時(shí)不創(chuàng)建main方法所在類(lèi)的實(shí)例對(duì)象,因而在main()方法中,不能直接訪(fǎng)問(wèn)該類(lèi)中的非靜態(tài)成員,必須創(chuàng)建該類(lèi)的一個(gè)實(shí)例對(duì)象后,才能通過(guò)這個(gè)對(duì)象去訪(fǎng)問(wèn)類(lèi)中的非靜態(tài)成員。3.5.3理解main方法的語(yǔ)法前面已經(jīng)知道,如果一個(gè)類(lèi)要被Java解釋器直接裝載運(yùn)行,這個(gè)類(lèi)中必須有main()方法,現(xiàn)在可以理解main方法的定義了。由于Java虛擬機(jī)需要調(diào)用類(lèi)的main()方法,所以該方法的訪(fǎng)問(wèn)權(quán)限必須是public,又因?yàn)镴ava虛擬機(jī)在執(zhí)行main()方法時(shí)不必創(chuàng)建對(duì)象,所以該方法必須是static的,該方法接收一個(gè)String類(lèi)型的數(shù)組,該數(shù)組中保存執(zhí)行Java命令時(shí)傳遞給所運(yùn)行的類(lèi)的參數(shù)。3.6內(nèi)部類(lèi)在一個(gè)類(lèi)的內(nèi)部定義類(lèi),這就是嵌套類(lèi),也叫內(nèi)部類(lèi)、內(nèi)置類(lèi)。嵌套類(lèi)可以直接訪(fǎng)問(wèn)嵌套它的類(lèi)的成員,包括private成員,但是,嵌套類(lèi)的成員卻不能被嵌套它的類(lèi)直接訪(fǎng)問(wèn)。3.6.1類(lèi)中定義的內(nèi)部類(lèi)在類(lèi)中直接定義的嵌套類(lèi)的使用范圍,僅限于這個(gè)類(lèi)的內(nèi)部,也就是說(shuō),A類(lèi)里定義了一個(gè)B類(lèi),那么B為A所知,卻不被A的外面所知。內(nèi)部類(lèi)的定義和普通類(lèi)的定義沒(méi)什么區(qū)別,它可以直接訪(fǎng)問(wèn)和引用它的外部類(lèi)的所有變量和方法。例:InnerClassDemo.java在上例程序中,內(nèi)部類(lèi)Inner定義在Outer類(lèi)的范圍之內(nèi),因此,在Inner類(lèi)之內(nèi)的display()方法可以直接訪(fǎng)問(wèn)Outer類(lèi)的變量outer_i。其實(shí),在內(nèi)部類(lèi)對(duì)象保存了一個(gè)外部類(lèi)對(duì)象的引用,當(dāng)內(nèi)部類(lèi)的成員方法中訪(fǎng)問(wèn)某一變量時(shí),如果在該方法和內(nèi)部類(lèi)中都沒(méi)有定義過(guò)這個(gè)變量,調(diào)用就會(huì)被傳遞給內(nèi)部類(lèi)中保存的那個(gè)外部類(lèi)對(duì)象的引用,通過(guò)那個(gè)外部類(lèi)對(duì)象的引用去調(diào)用這個(gè)變量,在內(nèi)部類(lèi)中調(diào)用外部類(lèi)的方法也是一樣的道理。一個(gè)內(nèi)部類(lèi)可以訪(fǎng)問(wèn)它的外部類(lèi)的成員,但是反過(guò)來(lái)就不成立了。內(nèi)部類(lèi)的成員只有在內(nèi)部類(lèi)的范圍之內(nèi)是可知的,并不能被外部類(lèi)使用。3.6.2內(nèi)部類(lèi)如何被外部引用內(nèi)部類(lèi)也可以通過(guò)創(chuàng)建對(duì)象從外部類(lèi)之外被調(diào)用,只要將內(nèi)部類(lèi)聲明為public即可,例:TestInner.java3.6.3方法中定義的內(nèi)部類(lèi)嵌套類(lèi)并非只能在類(lèi)里定義,也可以在幾個(gè)程序塊的范圍之內(nèi)定義內(nèi)部類(lèi)。例如,在方法中,或甚至在for循環(huán)內(nèi)部,都可以定義嵌套類(lèi)。例:InnerClassDemo2.java3.7類(lèi)的繼承面向?qū)ο蟮闹匾厣痪褪悄軌蚴褂靡郧敖ㄔ斓念?lèi)的方法和屬性,會(huì)節(jié)省很多編程時(shí)間,而且更為重要的是,這樣可以減少代碼出錯(cuò)的機(jī)會(huì)。這就是類(lèi)的繼承。3.7.1繼承的特點(diǎn)例:Student.java程序中通過(guò)extends關(guān)鍵字來(lái)表明類(lèi)Student具有類(lèi)Person的所有屬性和方法。我們說(shuō)Person類(lèi)Student類(lèi)的父類(lèi)(也叫基類(lèi)或超類(lèi)),Student類(lèi)是Person類(lèi)的子類(lèi)。在類(lèi)的繼承中,有一些細(xì)節(jié)問(wèn)題:(1)通過(guò)繼承可以簡(jiǎn)化類(lèi)的定義。(2)Java只支持單繼承,不允許多繼承。一個(gè)類(lèi)只能有一個(gè)父類(lèi),不允許一個(gè)類(lèi)直接繼承多個(gè)類(lèi),但一個(gè)類(lèi)可以被多個(gè)類(lèi)繼承。(3)可以有多層繼承,即一個(gè)類(lèi)可以繼承某一個(gè)類(lèi)的子類(lèi),如類(lèi)B繼承了類(lèi)A,類(lèi)C又可以繼承類(lèi)B,那么類(lèi)C也間接繼承了類(lèi)A。(4)子類(lèi)繼承父類(lèi)所有的成員變量和成員方法,但不繼承父類(lèi)的構(gòu)造方法。
在子類(lèi)的構(gòu)造方法中可以使用語(yǔ)句super(參數(shù)列表)調(diào)用父類(lèi)的構(gòu)造方法。如:publicStudent(String
name,int
age,Stringschool){super(name,age);
this.school=school;}(5)如果子類(lèi)的構(gòu)造方法中沒(méi)有顯示地調(diào)用父類(lèi)構(gòu)造方法,也沒(méi)有使用this關(guān)鍵字調(diào)用重載的其它構(gòu)造方法,則在產(chǎn)生子類(lèi)的實(shí)例對(duì)象時(shí),系統(tǒng)默認(rèn)調(diào)用父類(lèi)無(wú)參數(shù)的構(gòu)造方法。但此時(shí)如果父類(lèi)中沒(méi)有無(wú)參數(shù)的構(gòu)造方法,則編譯出錯(cuò)。所以,在定義類(lèi)時(shí),只要定義了有參數(shù)的構(gòu)造方法,通常都還需要定義一個(gè)無(wú)參數(shù)的構(gòu)造方法。3.7.2子類(lèi)對(duì)象的實(shí)例化過(guò)程如:Personp=newPerson(“zs”,19);(1)分配成員變量的存儲(chǔ)空間并進(jìn)行默認(rèn)的初始化。(2)綁定構(gòu)造方法參數(shù)。如將“zs”和19賦值給構(gòu)造方法中的形式參數(shù)變量。(3)如有this調(diào)用,則調(diào)用相應(yīng)的重載構(gòu)造方法。(4)顯式或隱式追溯調(diào)用父類(lèi)的構(gòu)造方法。(5)進(jìn)行實(shí)例變量的顯式初始化操作,也就是執(zhí)行在定義成員變量時(shí)就對(duì)其進(jìn)行賦值的語(yǔ)句。(6)執(zhí)行當(dāng)前構(gòu)造方法的方法體中和程序代碼。其中super(…)this(…)調(diào)用語(yǔ)句不能同時(shí)在一個(gè)構(gòu)造函數(shù)中出現(xiàn)。super(…)或this(…)調(diào)用語(yǔ)句只能作為構(gòu)造函數(shù)中的第一句出現(xiàn)。3.7.3覆蓋父類(lèi)的方法在子類(lèi)中可以根據(jù)需要對(duì)從父類(lèi)中繼承來(lái)的方法進(jìn)行改造:方法的覆蓋(也叫重寫(xiě))。覆蓋方法必須和被覆蓋方法具有相同的方法名稱(chēng)、參數(shù)列表和返回值類(lèi)型。例:Student1.java3.7.4final關(guān)鍵字1.在java中聲明類(lèi)、屬性和方法時(shí),可使用關(guān)鍵字final來(lái)修飾。2final標(biāo)記的類(lèi)不能被繼承。3final標(biāo)記的方法不能被子類(lèi)重寫(xiě)。4final標(biāo)記的變量即成為常量,只能賦值一次。final標(biāo)記的變量必須在聲明的同時(shí)或在該類(lèi)的構(gòu)造方法中顯式賦值。3.8抽象類(lèi)與接口3.8.1抽象類(lèi)Java中可以定義一些不含方法體的方法,它的方法體的實(shí)現(xiàn)交給該類(lèi)的子類(lèi)根據(jù)自己的情況去實(shí)現(xiàn),這樣的方法就是抽象方法,包含抽象方法的類(lèi)就叫做抽象類(lèi)。一個(gè)抽象類(lèi)中可以有一個(gè)或多個(gè)抽象方法。抽象方法必須用abstract修飾符來(lái)定義,任何帶有抽象方法的類(lèi)都必須聲明為抽象類(lèi)。1、抽象類(lèi)定義規(guī)則抽象類(lèi)必須用abstract關(guān)鍵字來(lái)修飾,抽象方法也必須用abstract來(lái)修飾。抽象類(lèi)不能被實(shí)例化,也就是不能用new關(guān)鍵字去產(chǎn)生對(duì)象。抽象方法只需聲明,而不需實(shí)現(xiàn)。含有抽象方法的類(lèi)必須被聲明為抽象類(lèi),抽象類(lèi)的子類(lèi)必須覆蓋所有的抽象方法后才能被實(shí)例化,否則這個(gè)子類(lèi)還是個(gè)抽象類(lèi)。2、抽象方法的寫(xiě)法
abstract返回值類(lèi)型抽象方法(參數(shù)列表);3、抽象類(lèi)和抽象方法的例子
abstractclassA{abstractint
aa(int
x,inty);}注意:含有抽象方法的類(lèi)肯定是抽象類(lèi),抽象類(lèi)中的某個(gè)方法不一定是抽象的。3.8.2接口(interface)如果一個(gè)抽象類(lèi)中的所有方法都是抽象的,就可以將這個(gè)類(lèi)用另外一種方式來(lái)定義,也就是接口定義。接口是抽象方法和常量值的定義和集合,從本質(zhì)上講,接口是一種特殊的抽象類(lèi),這種抽象類(lèi)中只包含常量和方法的定義,而沒(méi)有變量和方法的實(shí)現(xiàn)。如:
publicinterfaceRunner{
intID=1;voidrun();}在接口Runner的定義中,即使沒(méi)有顯式地將其中的成員用public關(guān)鍵字標(biāo)識(shí),但這些成員都是public訪(fǎng)問(wèn)類(lèi)型的。接口里的變量默認(rèn)是用publicstaticfinal標(biāo)識(shí)的。所以,接口中定義的變量就是全局靜態(tài)變量。我們可以定義一個(gè)新的接口,用extends關(guān)鍵字去繼承一個(gè)已有的接口;也可以定義一個(gè)類(lèi),用implements關(guān)鍵字去實(shí)現(xiàn)一個(gè)接口中的所有方法;還可以定義一個(gè)抽象的類(lèi),用implements關(guān)鍵字去實(shí)現(xiàn)一個(gè)接口中定義的部分方法。interfaceCanFight{voidfight();}interfaceCanSwim
{voidswim();}interfaceCanFly
{voidfly();}classActionCharacter{publicvoidfight(){}}classHeroextendsActionCharacterimplementsCanFight,CanSwim,CanFly
{publicvoidswim(){}publicvoidfly(){}}在java中,設(shè)計(jì)接口的目的是為了讓類(lèi)不必受限于單一繼承的關(guān)系,而可以靈活地同時(shí)繼承一些共有的特性,從而達(dá)到多重繼承的目的。一個(gè)類(lèi)可以在繼承一個(gè)父類(lèi)的同時(shí),實(shí)現(xiàn)一個(gè)或多個(gè)接口,extends關(guān)鍵字必須位于implements關(guān)鍵字之前。實(shí)現(xiàn)一個(gè)接口就是要實(shí)現(xiàn)該接口的所有方法(抽象類(lèi)除外)接口中的方法都是抽象的。多個(gè)無(wú)關(guān)的類(lèi)可以實(shí)現(xiàn)同一個(gè)接口,一個(gè)類(lèi)可以實(shí)現(xiàn)多個(gè)無(wú)關(guān)的接口。3.9對(duì)象的多態(tài)性3.9.1對(duì)象的類(lèi)型轉(zhuǎn)換子類(lèi)對(duì)象能夠自動(dòng)轉(zhuǎn)換成父類(lèi)的。但父類(lèi)的對(duì)象不能自動(dòng)轉(zhuǎn)換成子類(lèi)的,如需要,必須進(jìn)行強(qiáng)制類(lèi)型轉(zhuǎn)換。比如“男人”和“人”的關(guān)系。3.9.2面向?qū)ο蟮亩鄳B(tài)性例:Cdt.java盡管在callA(Aa)方法定義中,從字面上看是通過(guò)父類(lèi)的引用類(lèi)型變量a去調(diào)用其中的func1(),但實(shí)際執(zhí)行的是子類(lèi)中的func1()方法,這是因?yàn)閷?shí)際傳遞進(jìn)來(lái)的對(duì)象確實(shí)是子類(lèi)的實(shí)例對(duì)象,所以程序調(diào)用的是子類(lèi)中的func1()方法。同一段程序代碼,卻有兩種截然不同的結(jié)果,這就是面向?qū)ο蟮亩鄳B(tài)性。多態(tài)性有如下特點(diǎn):應(yīng)用程序不必為每一個(gè)子類(lèi)編寫(xiě)功能調(diào)用,只需要對(duì)抽象基類(lèi)進(jìn)行處理即可。子類(lèi)的功能可以被基類(lèi)的方法或引用變量調(diào)用,這叫做向后兼容,可以提高程序的可擴(kuò)充性和可維護(hù)性。3.9.3匿名內(nèi)部類(lèi)例:AnInner.java此例中,類(lèi)Inner僅使用了一次,對(duì)于此程序,可以簡(jiǎn)寫(xiě),在調(diào)用callInner方法時(shí),不用事先定義類(lèi)Inner,可以在給callInner方法傳遞參數(shù)時(shí),臨時(shí)創(chuàng)建一個(gè)類(lèi)A的匿名子類(lèi)的實(shí)例對(duì)象。例:AnInner2.java
3.10包為了對(duì)類(lèi)進(jìn)行分門(mén)別類(lèi)的管理,Java通過(guò)引入包機(jī)制,來(lái)解決此問(wèn)題。3.10.1package語(yǔ)句及應(yīng)用例:TestPackage.java程序中第一條語(yǔ)句,批示這個(gè)源文件中的所有類(lèi)都位于包.cysz中,位于包中的每個(gè)類(lèi)的完整名稱(chēng)都應(yīng)該是包名與類(lèi)名的組合,如類(lèi)TestPackage的完整名稱(chēng)是:.cysz.TestPackage
同一個(gè)包中的類(lèi)相互訪(fǎng)問(wèn),不用指定包名,如果從外部訪(fǎng)問(wèn)一個(gè)包中的類(lèi),必須用類(lèi)的完整名稱(chēng)。如果在命令行中啟動(dòng)Java虛擬機(jī),解釋運(yùn)行TestPackage類(lèi),必須用:java.cysz.TestPackage位于包中的類(lèi),在文件系統(tǒng)中的存放位置,必須有與包名層次相對(duì)應(yīng)的目錄結(jié)構(gòu)。在package語(yǔ)句中,用(.)來(lái)指明包的層次。所以例中的生成的類(lèi)要放于源文件所在目錄下的cn\com\cysz目錄下。
當(dāng)虛擬機(jī)要裝載.cysz.TestPackage類(lèi)時(shí),會(huì)沿著classpath環(huán)境變量指定的路徑中去逐一查找,查找這些路徑下是否有cn子目錄,接著在此目錄下查找com子目錄,再在下面去查找cysz子目錄,最后在此查找TestPackage.class文件。也可在編譯時(shí)
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 課題申報(bào)參考:近紅外光刺激輔助執(zhí)行功能訓(xùn)練改善兒童發(fā)展性閱讀障礙機(jī)制研究
- 2025年度個(gè)人與公司間藝術(shù)品收藏與交易合同4篇
- 2025年度個(gè)人房產(chǎn)買(mǎi)賣(mài)資金監(jiān)管服務(wù)合同4篇
- 二零二五年度車(chē)位鎖維修與保養(yǎng)服務(wù)合同3篇
- 二零二五年度體育用品買(mǎi)賣(mài)合同附帶運(yùn)動(dòng)損傷防護(hù)與售后服務(wù)4篇
- 2025年物流園區(qū)車(chē)位租賃與倉(cāng)儲(chǔ)管理合作協(xié)議4篇
- 2025年度智能挖掘機(jī)銷(xiāo)售與遠(yuǎn)程控制技術(shù)支持合同4篇
- 二零二五山地旅游交通服務(wù)租賃協(xié)議3篇
- 二零二五年度寵物寄養(yǎng)中心租賃合同規(guī)范4篇
- 二零二五年度工業(yè)用地租賃合同示范文本
- 2024年山東省泰安市高考物理一模試卷(含詳細(xì)答案解析)
- 護(hù)理指南手術(shù)器械臺(tái)擺放
- 腫瘤患者管理
- 2025年中國(guó)航空部附件維修行業(yè)市場(chǎng)競(jìng)爭(zhēng)格局、行業(yè)政策及需求規(guī)模預(yù)測(cè)報(bào)告
- 2025春夏運(yùn)動(dòng)戶(hù)外行業(yè)趨勢(shì)白皮書(shū)
- 《法制宣傳之盜竊罪》課件
- 通信工程單位勞動(dòng)合同
- 2024年醫(yī)療器械經(jīng)營(yíng)質(zhì)量管理規(guī)范培訓(xùn)課件
- 零部件測(cè)繪與 CAD成圖技術(shù)(中職組)沖壓機(jī)任務(wù)書(shū)
- 2024年計(jì)算機(jī)二級(jí)WPS考試題庫(kù)380題(含答案)
- 高低壓配電柜產(chǎn)品營(yíng)銷(xiāo)計(jì)劃書(shū)
評(píng)論
0/150
提交評(píng)論