




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
第4章繼承性和多態(tài)性第4章繼承性和多態(tài)性12主要內(nèi)容4.1繼承性派生類的定義super關(guān)鍵字protected和final關(guān)鍵字4.2多態(tài)性4.3抽象類和接口抽象類接口4.4初始化塊繼承性&多態(tài)性2主要內(nèi)容4.1繼承性繼承性&多態(tài)性234.1繼承性類具有繼承性,子類對父類的繼承關(guān)系體現(xiàn)了現(xiàn)實世界中特殊和一般的關(guān)系。通過繼承可以更有效地組織程序結(jié)構(gòu),明確類間關(guān)系,并充分利用已有的類來完成更復雜、深入的開發(fā)。4.1.1派生類的定義Java中的所有類都是java.lang.Object類的子類。Java語言中派生類的定義格式如下:示例:參看例4.1class<子類>extends<唯一的父類名>{<類定義體>}繼承性&多態(tài)性34.1繼承性類具有繼承性,子類對父類的繼承關(guān)系體現(xiàn)了現(xiàn)實344.1.2super關(guān)鍵字1.數(shù)據(jù)成員的隱藏數(shù)據(jù)成員的隱藏是指在子類中重新定義一個與父類中已定義的數(shù)據(jù)成員名完全相同的數(shù)據(jù)成員,即子類擁有了兩個相同名字的數(shù)據(jù)成員,一個是繼承父類的,另一個是自己定義的。當子類要操作繼承自父類的同名數(shù)據(jù)成員時,可使用關(guān)鍵字super引導。2.成員方法的覆蓋子類可以重新定義與父類格式完全相同(包括方法名、方法形參的個數(shù)和類型、方法返回值的類型)的成員方法,實現(xiàn)對父類方法的覆蓋。繼承性&多態(tài)性44.1.2super關(guān)鍵字1.數(shù)據(jù)成員的隱藏繼承性&多45關(guān)于方法覆蓋只有當實例方法能被訪問時,才能進行方法覆蓋。私有方法不能被覆蓋.靜態(tài)方法(類方法)能被繼承,但不能被覆蓋。子類在重新定義父類已有的方法時,應(yīng)保持與父類完全相同的方法名、返回值類型和參數(shù)列表,否則就不是方法的覆蓋,而是子類定義自己特有的方法,與父類的方法無關(guān)。繼承性&多態(tài)性5關(guān)于方法覆蓋只有當實例方法能被訪問時,才能進行方法覆蓋。私563.super關(guān)鍵字super表示的是當前對象的直接父類對象,是當前對象的直接父類對象的引用。super的使用方法有三種:(1)訪問直接父類隱藏的數(shù)據(jù)成員,其使用形式如下:super.數(shù)據(jù)成員(2)調(diào)用直接父類中被覆蓋的成員方法,其使用形式如下:super.成員方法(參數(shù))(3)調(diào)用直接父類的構(gòu)造方法,其使用形式如下:super(參數(shù))示例:參看例4.2繼承性&多態(tài)性63.super關(guān)鍵字super表示的是當前對象的直接父類673.super關(guān)鍵字子類中一定要調(diào)用父類的構(gòu)造方法1、子類的構(gòu)造方法必須調(diào)用父類的構(gòu)造方法
2、子類可以在自己的構(gòu)造函數(shù)中用super(argument_list)調(diào)用父類的構(gòu)造方法
3、如果子類的構(gòu)造函數(shù)中沒有顯式地調(diào)用父類的構(gòu)造方法,系統(tǒng)將自動調(diào)用父類無參數(shù)的構(gòu)造方法,此時如果父類中不存在無參數(shù)構(gòu)造函數(shù)的話,編譯會出差錯
4、如果子類構(gòu)造函數(shù)調(diào)用super(argument_list),這個語句必須寫在構(gòu)造函數(shù)的第一行繼承性&多態(tài)性73.super關(guān)鍵字子類中一定要調(diào)用父類的構(gòu)造方法繼承784.1.3protected和final關(guān)鍵字1.protected關(guān)鍵字用protected修飾的成員變量可以被三種類所引:該類自身、與它在同一個包中的其它類及在其它包中的該類的子類。2.final關(guān)鍵字使用final關(guān)鍵字可以定義常量。定義類時,在class關(guān)鍵字前加關(guān)鍵字final,表示此類是最終類,不能被其它類繼承,不能做父類。用final修飾成員方法,表示此方法不能被它的子類覆蓋。繼承性&多態(tài)性84.1.3protected和final關(guān)鍵字1.pr893.native關(guān)鍵字native修飾的方法稱為本地方法,此方法使用的目的是為了將其它語言(例如,C、C++、FORTRAN、匯編等)嵌入到Java語言中。這樣可以充分利用已經(jīng)存在的其它語言的程序功能模塊,避免重復編程。繼承性&多態(tài)性93.native關(guān)鍵字native修飾的方法稱為本地方法9104.2多態(tài)性多態(tài)是面向?qū)ο蟪绦蛟O(shè)計語言的一個重要特性,在Java中,可以在同一類或不同類中定義名稱相同但是操作不同的多個方法。在Java語言中,多態(tài)性分為編譯時多態(tài)性和運行時多態(tài)性。繼承性&多態(tài)性104.2多態(tài)性多態(tài)是面向?qū)ο蟪绦蛟O(shè)計語言的一個重要特性,1011編譯時的多態(tài)性通過方法重載實現(xiàn)。Java虛擬機根據(jù)傳遞給方法的參數(shù)個數(shù)和類型決定調(diào)用哪個重載方法。例如,java的打印函數(shù)對應(yīng)的具體情況和操作有多種,如實數(shù)打印、整數(shù)打印、字符打印等。為了使打印功能完整,實際上定義了若干個名字都叫print的方法,每個方法用來完成一種不同于其他方法的具體打印操作,處理一種具體的打印情況。繼承性&多態(tài)性11編譯時的多態(tài)性通過方法重載實現(xiàn)。Java虛擬機根據(jù)傳遞給11例:TestOverride.java 1:publicclassTestOverride 2:{ 3:publicstaticvoidmain(Stringargs[]) 4:{ 5:D200-Cardmy200=newD200- Card(12345678,1234,50.0,″200″); 6:if(my200.performDial(12345678,1234))
7: System.out.println(″撥打電話后剩余金額為: ″+my200.getBalance()); 8:if(my200.performDial()) 9: System.out.println(″撥打電話后剩余金額為: ″+my200.getBalance()); 10:} 11:}繼承性&多態(tài)性例:TestOverride.java繼承性&多態(tài)性12 51:booleanperformDial() 52:{ 53:if(!connected) 54:returnfalse; 55:if(balance>(0.5+additoryFee)) 56:{ 57:balance-=(0.5+additoryFee); 58:returntrue; 59:} 60:else 61:returnfalse; 62:} 51:booleanperformDial()13 63:booleanperformDial(longcn,intpass) 64:{ 65:if(performConnection(cn,pass)) 66:returnperformDial(); 67:else 68:returnfalse; 69:} 70:doublegetBalance() 71:{ 72:if(connected) 73:returnbalance; 74:else 75:return-1; 76:} 77:} 63:booleanperformDial(long14 40:classD200-CardextendsNumber-PhoneCard 41:{ 44:D200-Card(longcn,intpw,doubleb,Stringc) 45:{ 46:cardNumber=cn;//創(chuàng)建對象時設(shè)置卡號和密碼 47:password=pw; 48:balance=b; 49:connectNumber=c; 50:}繼承性&多態(tài)性 40:classD200-Cardextends1516運行時的多態(tài)性是Java多態(tài)性的最重要的體現(xiàn),在Java語言的繼承關(guān)系中,子類對象與父類對象之間有一個重要特性:在任何需要父類對象的地方,都可以使用子類對象來代替,即子類對象可以作為父類對象來使用。一個對象可以通過引用子類的實例來調(diào)用子類的方法,通常,方法在父類中定義,在子類中覆蓋,子類中調(diào)用哪個方法是在運行時決定的,取決于對象的類型,稱為運行時的多態(tài)性。示例:參看例4.3繼承性&多態(tài)性16運行時的多態(tài)性是Java多態(tài)性的最重要的體現(xiàn),在Java16174.3抽象類和接口抽象類體現(xiàn)數(shù)據(jù)抽象的思想,是實現(xiàn)程序多態(tài)性的一種手段。接口則是Java中實現(xiàn)多重繼承的唯一途徑。4.3.1抽象類抽象類的作用在于將許多有關(guān)的類組織在一起,提供一個公共的類,即抽象類,而那些被它組織在一起的具體的類做為它的子類由它派生出來。定義一個抽象類的格式如下:abstractclassabstractClass{/*類定義體*/}抽象方法是指在返回值類型前加上abstract關(guān)鍵字,且沒有方法體。格式如下:abstract<返回值類型><抽象方法名>([<形式參數(shù)列表>]);示例:參看例4.4繼承性&多態(tài)性174.3抽象類和接口抽象類體現(xiàn)數(shù)據(jù)抽象的思想,是實現(xiàn)程1718對于抽象類與抽象方法的限制(1)凡是用abstract修飾符修飾的類被稱為抽象類。凡是用abstract修飾符修飾的成員方法被稱為抽象方法;(2)抽象類中可以有零個或多個抽象方法,也可以包含非抽象的方法;(3)抽象類中可以沒有抽象方法,但是,有抽象方法的類必須是抽象類;(4)對于抽象方法來說,在抽象類中只指定其方法名及其類型,而不書寫其實現(xiàn)代碼;(5)抽象類可以派生子類,在抽象類派生的子類中必須實現(xiàn)抽象類中定義的所有抽象方法;繼承性&多態(tài)性18對于抽象類與抽象方法的限制(1)凡是用abstrac1819(6)抽象類不能使用new運算符創(chuàng)建對象,但仍可在抽象類中定義構(gòu)造方法,可由派生類的構(gòu)造方法調(diào)用;(7)abstract和final不能同時修飾一個類;(8)abstract不能與private、static、final或native同時修飾一個方法;(9)abstract類中不能有private的數(shù)據(jù)成員或成員方法;(10)父類是非抽象類(即具體類),則其子類仍可是抽象類;(11)雖然不能創(chuàng)建抽象類的對象,但抽象類可以當作數(shù)據(jù)類型使用,如作為方法形參類型、返回值類型、數(shù)組元素類型等等。
繼承性&多態(tài)性19(6)抽象類不能使用new運算符創(chuàng)建對象,但仍可在抽象19204.3.2
接口與C++不同,Java不支持多重繼承,而是用接口實現(xiàn)比多重繼承更強的功能。接口則把方法的定義和類的層次區(qū)分開來,接口可以實現(xiàn)“多重繼承”,一個類可實現(xiàn)多個接口,正是這些機制使得接口提供了比多重繼承更簡單,更靈活,而且更強健的功能。接口就是方法定義和常量值的集合。從本質(zhì)上講,接口是一種特殊的抽象類,這種抽象類中只包含常量和方法的定義,而沒有方法的實現(xiàn)。繼承性&多態(tài)性204.3.2
接口與C++不同,Java不支持多重繼承,而20211.聲明接口聲明接口的格式如下:[修飾符]interface接口名[extends父接口名列表]{常量數(shù)據(jù)成員聲明抽象方法聲明}其中:(1)interface是聲明接口的關(guān)鍵字,可以把它看成一個特殊類;(2)接口名要求符合Java標識符命名規(guī)則;(3)修飾符有兩種:public和默認。public修飾的接口是公共接口,可以被所有的類和接口使用;默認修飾符的接口只能被同一個包中的其它類和接口使用;繼承性&多態(tài)性211.聲明接口聲明接口的格式如下:繼承性&多態(tài)性2122(4)父接口列表:接口也具有繼承性。定義一個接口時可以通過extends關(guān)鍵字聲明該接口是某個已經(jīng)存在的父接口的派生接口,它將繼承父接口的所有屬性和方法。與類的繼承不同的是一個接口可以有一個以上的父接口,它們之間用逗號分隔;(5)常量數(shù)據(jù)成員聲明:常量數(shù)據(jù)成員前可以有也可省略修飾符。修飾符是publicstatic和fina1;接口中的數(shù)據(jù)成員都是用final修飾的常量,寫法如下:修飾符數(shù)據(jù)成員類型數(shù)據(jù)成員名=常量值或數(shù)據(jù)成員名=常量值例如:publicfinalstaticdoublePI=3.14159;//等價于doublePI=3.14159;intSUM=100;//等價于finalstaticintSUM=100;繼承性&多態(tài)性22(4)父接口列表:接口也具有繼承性。定義一個接口時可以2223(6)接口中沒有自身的構(gòu)造方法,所有成員方法都是抽象方法;在接口中只能給出這些抽象方法的方法名、返回值和參數(shù)列表,而不能定義方法體,即僅僅規(guī)定了一組信息交換、傳輸和處理的“接口”。格式如下:返回值類型方法名(參數(shù)列表);繼承性&多態(tài)性23(6)接口中沒有自身的構(gòu)造方法,所有成員方法都是抽象方23242.接口的實現(xiàn)接口定義僅僅是實現(xiàn)某一特定功能的一組功能的對外接口和規(guī)范,而不能真正地實現(xiàn)這個功能,這個功能的真正實現(xiàn)是在“繼承”這個接口的各個類中完成的,要由這些類來具體定義接口中各抽象方法的方法體。一個類只能繼承一個父類,但是可實現(xiàn)多個接口。類定義的完整格式如下:[<修飾符>]class<類名>[extends<父類名>][implements<接口名1>,<接口名2>,……]{//類定義體}示例:參看例4.5繼承性&多態(tài)性242.接口的實現(xiàn)接口定義僅僅是實現(xiàn)某一特定功能的一組功能的2425關(guān)于接口的實現(xiàn)(1)在類中,用implements關(guān)鍵字就可以調(diào)用接口。一個類可以調(diào)用多個接口,這時,在implements后用逗號隔開多個接口的名字;(2)如果實現(xiàn)某接口的類不是抽象類,則在類的定義體部分必須實現(xiàn)指定接口的所有抽象方法,即為所有抽象方法定義方法體,而且方法頭部分應(yīng)該與接口中的定義完全一致,即有完全相同的返回值和參數(shù)列表;(3)如果實現(xiàn)某接口的類是抽象類,則它可以不實現(xiàn)該接口所有的方法。(4)接口的抽象方法的訪問限制符都己指定為public,所以類在實現(xiàn)方法時,必須顯式地使用public修飾符,否則編譯系統(tǒng)警告為縮小了接口中定義的方法的訪問控制范圍。繼承性&多態(tài)性25關(guān)于接口的實現(xiàn)(1)在類中,用implements關(guān)鍵25263.接口和抽象類的區(qū)別Java中所有的類有共同的父類java.lang.Object,但接口沒有共同的根。接口可以當作抽象類使用。它們的區(qū)別如下:(1)接口中的每個方法,沒有實現(xiàn)部分,都是抽象方法;抽象類中可以有具體的方法。(2)接口中的數(shù)據(jù)必須是常量;抽象類可以有各種類型的數(shù)據(jù)。(3)由于定義在接口中的所有方法都是抽象方法,接口中可以省略abstract修飾符;但是抽象類中的抽象方法必須用abstract修飾。繼承性&多態(tài)性263.接口和抽象類的區(qū)別Java中所有的類有共同的父類ja26274.類型轉(zhuǎn)換和instanceof運算符基本數(shù)據(jù)類型可以進行強制或自動類型轉(zhuǎn)換,也可以把一個類的對象轉(zhuǎn)換為繼承鏈中的另一個對象。將子類的實例轉(zhuǎn)換為父類的實例總是可行的,因為子類的實例也是父類的實例。例如例4.5中的語句Shapes[0]=point;//等價于Shapes[0]=(Shape)point;把父類對象轉(zhuǎn)換為子類對象時,必須使用強制類型轉(zhuǎn)換,為使轉(zhuǎn)換成功,必須確保轉(zhuǎn)換的對象是子類的一個實例。繼承性&多態(tài)性274.類型轉(zhuǎn)換和instanceof運算符基本數(shù)據(jù)類型可2728進行轉(zhuǎn)換時確保該對象是另一個類的實例,可以利用instanceof運算符來完成。如:Pointpoint1=newPoint();//Point是Circle的父類if(point1instanceofCircle){ Circlecircle1=(Circle)point1;}繼承性&多態(tài)性28進行轉(zhuǎn)換時確保該對象是另一個類的實例,可以利用insta2829父類對象與和子類對象的轉(zhuǎn)化需要注意如下的原則:(1)子類對象可以被視為是其父類的一個對象;(2)父類對象不能當成是其某一個子類的對象;(3)如果一個方法的形式參數(shù)定義的是父類對象,那么調(diào)用這個方法時,可以使用子類對象作為形式參數(shù);(4)如果父類對象引用指向的實際是一個子類對象,那么這個父類對象的引用可以用強制類型轉(zhuǎn)換轉(zhuǎn)化成子類對象的引用。在轉(zhuǎn)換之前要使用instanceof運算符進行判斷。繼承性&多態(tài)性29父類對象與和子類對象的轉(zhuǎn)化需要注意如下的原則:(1)子29305.Cloneable接口接口包含常量和抽象方法,但是Cloneable接口例外,Cloneable接口定義如下:publicinterfaceCloneable{}Cloneable接口的定義體為空,體為空的接口稱為標記接口。Java系統(tǒng)要求,可復制的類需要實現(xiàn)Cloneable接口,利用定義在Object類中的clone()方法,可以克隆可復制類的對象。示例:參看例4.6與4.7繼承性&多態(tài)性305.Cloneable接口接口包含常量和抽象方法,但是C30314.4初始化塊初始化塊用來和構(gòu)造方法一起初始化對象。初始化塊是封裝在一對大括號內(nèi)的語句塊,初始化塊在類的定義體內(nèi),但不能包含在方法體內(nèi)或構(gòu)造方法體內(nèi)。初始化塊分為對象(實例)初始化塊和靜態(tài)(類)初始化塊。靜態(tài)數(shù)據(jù)成員、初始化塊和構(gòu)造方法的執(zhí)行順序如下:(1)當?shù)谝淮问褂妙悤r,首先裝載類,初始化靜態(tài)數(shù)據(jù)成員,然后執(zhí)行類的靜態(tài)初始化塊。(2)當使用new運算符創(chuàng)建類的對象時,按下述三個步驟執(zhí)行:①調(diào)用父類的構(gòu)造方法(在調(diào)用父類的構(gòu)造方法時,也按照這三個步驟執(zhí)行)。②初始化實例數(shù)據(jù)域,執(zhí)行對象初始化塊。③執(zhí)行構(gòu)造方法。示例:參看例4.8繼承性&多態(tài)性314.4初始化塊初始化塊用來和構(gòu)造方法一起初始化對象。初31第4章繼承性和多態(tài)性第4章繼承性和多態(tài)性3233主要內(nèi)容4.1繼承性派生類的定義super關(guān)鍵字protected和final關(guān)鍵字4.2多態(tài)性4.3抽象類和接口抽象類接口4.4初始化塊繼承性&多態(tài)性2主要內(nèi)容4.1繼承性繼承性&多態(tài)性33344.1繼承性類具有繼承性,子類對父類的繼承關(guān)系體現(xiàn)了現(xiàn)實世界中特殊和一般的關(guān)系。通過繼承可以更有效地組織程序結(jié)構(gòu),明確類間關(guān)系,并充分利用已有的類來完成更復雜、深入的開發(fā)。4.1.1派生類的定義Java中的所有類都是java.lang.Object類的子類。Java語言中派生類的定義格式如下:示例:參看例4.1class<子類>extends<唯一的父類名>{<類定義體>}繼承性&多態(tài)性34.1繼承性類具有繼承性,子類對父類的繼承關(guān)系體現(xiàn)了現(xiàn)實34354.1.2super關(guān)鍵字1.數(shù)據(jù)成員的隱藏數(shù)據(jù)成員的隱藏是指在子類中重新定義一個與父類中已定義的數(shù)據(jù)成員名完全相同的數(shù)據(jù)成員,即子類擁有了兩個相同名字的數(shù)據(jù)成員,一個是繼承父類的,另一個是自己定義的。當子類要操作繼承自父類的同名數(shù)據(jù)成員時,可使用關(guān)鍵字super引導。2.成員方法的覆蓋子類可以重新定義與父類格式完全相同(包括方法名、方法形參的個數(shù)和類型、方法返回值的類型)的成員方法,實現(xiàn)對父類方法的覆蓋。繼承性&多態(tài)性44.1.2super關(guān)鍵字1.數(shù)據(jù)成員的隱藏繼承性&多3536關(guān)于方法覆蓋只有當實例方法能被訪問時,才能進行方法覆蓋。私有方法不能被覆蓋.靜態(tài)方法(類方法)能被繼承,但不能被覆蓋。子類在重新定義父類已有的方法時,應(yīng)保持與父類完全相同的方法名、返回值類型和參數(shù)列表,否則就不是方法的覆蓋,而是子類定義自己特有的方法,與父類的方法無關(guān)。繼承性&多態(tài)性5關(guān)于方法覆蓋只有當實例方法能被訪問時,才能進行方法覆蓋。私36373.super關(guān)鍵字super表示的是當前對象的直接父類對象,是當前對象的直接父類對象的引用。super的使用方法有三種:(1)訪問直接父類隱藏的數(shù)據(jù)成員,其使用形式如下:super.數(shù)據(jù)成員(2)調(diào)用直接父類中被覆蓋的成員方法,其使用形式如下:super.成員方法(參數(shù))(3)調(diào)用直接父類的構(gòu)造方法,其使用形式如下:super(參數(shù))示例:參看例4.2繼承性&多態(tài)性63.super關(guān)鍵字super表示的是當前對象的直接父類37383.super關(guān)鍵字子類中一定要調(diào)用父類的構(gòu)造方法1、子類的構(gòu)造方法必須調(diào)用父類的構(gòu)造方法
2、子類可以在自己的構(gòu)造函數(shù)中用super(argument_list)調(diào)用父類的構(gòu)造方法
3、如果子類的構(gòu)造函數(shù)中沒有顯式地調(diào)用父類的構(gòu)造方法,系統(tǒng)將自動調(diào)用父類無參數(shù)的構(gòu)造方法,此時如果父類中不存在無參數(shù)構(gòu)造函數(shù)的話,編譯會出差錯
4、如果子類構(gòu)造函數(shù)調(diào)用super(argument_list),這個語句必須寫在構(gòu)造函數(shù)的第一行繼承性&多態(tài)性73.super關(guān)鍵字子類中一定要調(diào)用父類的構(gòu)造方法繼承38394.1.3protected和final關(guān)鍵字1.protected關(guān)鍵字用protected修飾的成員變量可以被三種類所引:該類自身、與它在同一個包中的其它類及在其它包中的該類的子類。2.final關(guān)鍵字使用final關(guān)鍵字可以定義常量。定義類時,在class關(guān)鍵字前加關(guān)鍵字final,表示此類是最終類,不能被其它類繼承,不能做父類。用final修飾成員方法,表示此方法不能被它的子類覆蓋。繼承性&多態(tài)性84.1.3protected和final關(guān)鍵字1.pr39403.native關(guān)鍵字native修飾的方法稱為本地方法,此方法使用的目的是為了將其它語言(例如,C、C++、FORTRAN、匯編等)嵌入到Java語言中。這樣可以充分利用已經(jīng)存在的其它語言的程序功能模塊,避免重復編程。繼承性&多態(tài)性93.native關(guān)鍵字native修飾的方法稱為本地方法40414.2多態(tài)性多態(tài)是面向?qū)ο蟪绦蛟O(shè)計語言的一個重要特性,在Java中,可以在同一類或不同類中定義名稱相同但是操作不同的多個方法。在Java語言中,多態(tài)性分為編譯時多態(tài)性和運行時多態(tài)性。繼承性&多態(tài)性104.2多態(tài)性多態(tài)是面向?qū)ο蟪绦蛟O(shè)計語言的一個重要特性,4142編譯時的多態(tài)性通過方法重載實現(xiàn)。Java虛擬機根據(jù)傳遞給方法的參數(shù)個數(shù)和類型決定調(diào)用哪個重載方法。例如,java的打印函數(shù)對應(yīng)的具體情況和操作有多種,如實數(shù)打印、整數(shù)打印、字符打印等。為了使打印功能完整,實際上定義了若干個名字都叫print的方法,每個方法用來完成一種不同于其他方法的具體打印操作,處理一種具體的打印情況。繼承性&多態(tài)性11編譯時的多態(tài)性通過方法重載實現(xiàn)。Java虛擬機根據(jù)傳遞給42例:TestOverride.java 1:publicclassTestOverride 2:{ 3:publicstaticvoidmain(Stringargs[]) 4:{ 5:D200-Cardmy200=newD200- Card(12345678,1234,50.0,″200″); 6:if(my200.performDial(12345678,1234))
7: System.out.println(″撥打電話后剩余金額為: ″+my200.getBalance()); 8:if(my200.performDial()) 9: System.out.println(″撥打電話后剩余金額為: ″+my200.getBalance()); 10:} 11:}繼承性&多態(tài)性例:TestOverride.java繼承性&多態(tài)性43 51:booleanperformDial() 52:{ 53:if(!connected) 54:returnfalse; 55:if(balance>(0.5+additoryFee)) 56:{ 57:balance-=(0.5+additoryFee); 58:returntrue; 59:} 60:else 61:returnfalse; 62:} 51:booleanperformDial()44 63:booleanperformDial(longcn,intpass) 64:{ 65:if(performConnection(cn,pass)) 66:returnperformDial(); 67:else 68:returnfalse; 69:} 70:doublegetBalance() 71:{ 72:if(connected) 73:returnbalance; 74:else 75:return-1; 76:} 77:} 63:booleanperformDial(long45 40:classD200-CardextendsNumber-PhoneCard 41:{ 44:D200-Card(longcn,intpw,doubleb,Stringc) 45:{ 46:cardNumber=cn;//創(chuàng)建對象時設(shè)置卡號和密碼 47:password=pw; 48:balance=b; 49:connectNumber=c; 50:}繼承性&多態(tài)性 40:classD200-Cardextends4647運行時的多態(tài)性是Java多態(tài)性的最重要的體現(xiàn),在Java語言的繼承關(guān)系中,子類對象與父類對象之間有一個重要特性:在任何需要父類對象的地方,都可以使用子類對象來代替,即子類對象可以作為父類對象來使用。一個對象可以通過引用子類的實例來調(diào)用子類的方法,通常,方法在父類中定義,在子類中覆蓋,子類中調(diào)用哪個方法是在運行時決定的,取決于對象的類型,稱為運行時的多態(tài)性。示例:參看例4.3繼承性&多態(tài)性16運行時的多態(tài)性是Java多態(tài)性的最重要的體現(xiàn),在Java47484.3抽象類和接口抽象類體現(xiàn)數(shù)據(jù)抽象的思想,是實現(xiàn)程序多態(tài)性的一種手段。接口則是Java中實現(xiàn)多重繼承的唯一途徑。4.3.1抽象類抽象類的作用在于將許多有關(guān)的類組織在一起,提供一個公共的類,即抽象類,而那些被它組織在一起的具體的類做為它的子類由它派生出來。定義一個抽象類的格式如下:abstractclassabstractClass{/*類定義體*/}抽象方法是指在返回值類型前加上abstract關(guān)鍵字,且沒有方法體。格式如下:abstract<返回值類型><抽象方法名>([<形式參數(shù)列表>]);示例:參看例4.4繼承性&多態(tài)性174.3抽象類和接口抽象類體現(xiàn)數(shù)據(jù)抽象的思想,是實現(xiàn)程4849對于抽象類與抽象方法的限制(1)凡是用abstract修飾符修飾的類被稱為抽象類。凡是用abstract修飾符修飾的成員方法被稱為抽象方法;(2)抽象類中可以有零個或多個抽象方法,也可以包含非抽象的方法;(3)抽象類中可以沒有抽象方法,但是,有抽象方法的類必須是抽象類;(4)對于抽象方法來說,在抽象類中只指定其方法名及其類型,而不書寫其實現(xiàn)代碼;(5)抽象類可以派生子類,在抽象類派生的子類中必須實現(xiàn)抽象類中定義的所有抽象方法;繼承性&多態(tài)性18對于抽象類與抽象方法的限制(1)凡是用abstrac4950(6)抽象類不能使用new運算符創(chuàng)建對象,但仍可在抽象類中定義構(gòu)造方法,可由派生類的構(gòu)造方法調(diào)用;(7)abstract和final不能同時修飾一個類;(8)abstract不能與private、static、final或native同時修飾一個方法;(9)abstract類中不能有private的數(shù)據(jù)成員或成員方法;(10)父類是非抽象類(即具體類),則其子類仍可是抽象類;(11)雖然不能創(chuàng)建抽象類的對象,但抽象類可以當作數(shù)據(jù)類型使用,如作為方法形參類型、返回值類型、數(shù)組元素類型等等。
繼承性&多態(tài)性19(6)抽象類不能使用new運算符創(chuàng)建對象,但仍可在抽象50514.3.2
接口與C++不同,Java不支持多重繼承,而是用接口實現(xiàn)比多重繼承更強的功能。接口則把方法的定義和類的層次區(qū)分開來,接口可以實現(xiàn)“多重繼承”,一個類可實現(xiàn)多個接口,正是這些機制使得接口提供了比多重繼承更簡單,更靈活,而且更強健的功能。接口就是方法定義和常量值的集合。從本質(zhì)上講,接口是一種特殊的抽象類,這種抽象類中只包含常量和方法的定義,而沒有方法的實現(xiàn)。繼承性&多態(tài)性204.3.2
接口與C++不同,Java不支持多重繼承,而51521.聲明接口聲明接口的格式如下:[修飾符]interface接口名[extends父接口名列表]{常量數(shù)據(jù)成員聲明抽象方法聲明}其中:(1)interface是聲明接口的關(guān)鍵字,可以把它看成一個特殊類;(2)接口名要求符合Java標識符命名規(guī)則;(3)修飾符有兩種:public和默認。public修飾的接口是公共接口,可以被所有的類和接口使用;默認修飾符的接口只能被同一個包中的其它類和接口使用;繼承性&多態(tài)性211.聲明接口聲明接口的格式如下:繼承性&多態(tài)性5253(4)父接口列表:接口也具有繼承性。定義一個接口時可以通過extends關(guān)鍵字聲明該接口是某個已經(jīng)存在的父接口的派生接口,它將繼承父接口的所有屬性和方法。與類的繼承不同的是一個接口可以有一個以上的父接口,它們之間用逗號分隔;(5)常量數(shù)據(jù)成員聲明:常量數(shù)據(jù)成員前可以有也可省略修飾符。修飾符是publicstatic和fina1;接口中的數(shù)據(jù)成員都是用final修飾的常量,寫法如下:修飾符數(shù)據(jù)成員類型數(shù)據(jù)成員名=常量值或數(shù)據(jù)成員名=常量值例如:publicfinalstaticdoublePI=3.14159;//等價于doublePI=3.14159;intSUM=100;//等價于finalstaticintSUM=100;繼承性&多態(tài)性22(4)父接口列表:接口也具有繼承性。定義一個接口時可以5354(6)接口中沒有自身的構(gòu)造方法,所有成員方法都是抽象方法;在接口中只能給出這些抽象方法的方法名、返回值和參數(shù)列表,而不能定義方法體,即僅僅規(guī)定了一組信息交換、傳輸和處理的“接口”。格式如下:返回值類型方法名(參數(shù)列表);繼承性&多態(tài)性23(6)接口中沒有自身的構(gòu)造方法,所有成員方法都是抽象方54552.接口的實現(xiàn)接口定義僅僅是實現(xiàn)某一特定功能的一組功能的對外接口和規(guī)范,而不能真正地實現(xiàn)這個功能,這個功能的真正實現(xiàn)是在“繼承”這個接口的各個類中完成的,要由這些類來具體定義接口中各抽象方法的方法體。一個類只能繼承一個父類,但是可實現(xiàn)多個接口。類定義的完整格式如下:[<修飾符>]class<類名>[extends<父類名>][implements<接口名1>,<接口名2>,……]{//類定義體}示例:參看例4.5繼承性&多態(tài)性242.接口的實現(xiàn)接口定義僅僅是實現(xiàn)某一特定功能的一組功能的5556關(guān)于接口的實現(xiàn)(1)在類中,用implements關(guān)鍵字就可以調(diào)用接口。一個類可以調(diào)用多個接口,這時,在implements后用逗號隔開多個接口的名字;(2)如果實現(xiàn)某接口的類不是抽象類,則在類的定義體部分必須實現(xiàn)指定接口的所有抽象方法,即為所有抽象方法定義方法體,而且方法頭部分應(yīng)該與接口中的定義完全一致,即有完全相同的返回值和參數(shù)列表;(3)如果實現(xiàn)某接口的類是抽象類,則它可以不實現(xiàn)該接口所有的方法。(4)接口的抽象方法的訪問限制符都己指定為public,所以類在實現(xiàn)方法時,必須顯式地使用public修飾符,否則編譯系統(tǒng)警告為縮小了接口中定義的方法的訪問控制范圍。
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 勞工合同范本 微盤
- 勞工計件合同范本
- 古建筑彩繪合同范本
- 廠房 改建合同范本
- 單位花束訂購合同范本
- 全廠木工設(shè)備轉(zhuǎn)讓合同范本
- 關(guān)于會展合同范本
- 廠房包租合同范例
- 江蘇2025年01月常州市衛(wèi)生健康委員會直屬事業(yè)單位2025年公開招考191名衛(wèi)技人員筆試歷年典型考題(歷年真題考點)解題思路附帶答案詳解
- 司機入職合同范本
- 固定式塔式起重機基礎(chǔ)設(shè)計及計算
- 奶牛性控凍精的使用細則:張相文 整理
- GB/T 34376-2017數(shù)控板料折彎機技術(shù)條件
- GB/T 22492-2008大豆肽粉
- 四年級下冊美術(shù)課件 4紙卷魔術(shù)|蘇少版
- 三年級下冊豎式脫式計算
- 《財務(wù)風險的識別與評估管理國內(nèi)外文獻綜述》
- 海口市存量房買賣合同模板(范本)
- 經(jīng)典文學作品中的女性形象研究外文文獻翻譯2016年
- 高爐煤氣安全知識的培訓
- 2008 年全國高校俄語專業(yè)四級水平測試試卷
評論
0/150
提交評論