接口繼承和多態_第1頁
接口繼承和多態_第2頁
接口繼承和多態_第3頁
接口繼承和多態_第4頁
接口繼承和多態_第5頁
已閱讀5頁,還剩62頁未讀 繼續免費閱讀

VIP免費下載

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

第8章接口、繼承和多態8.1接口的使用8.2類的繼承8.3多態8.4Object類8.5對象類型的轉換8.6instanceof判斷對象類型主要內容8.2類的繼承8.2.1繼承的實現8.2.2繼承中的重寫8.2.3使用super關鍵字8.2.1繼承的實現繼承是指一個類的定義可以基于另外一個已經存在的類,即子類基于父類,從而實現父類代碼的重用。Java中只允許每個子類擁有一個直接父類,即單繼承。在Java語言中,繼承通過關鍵字extends來實現。即在子類的聲明中,通過使用關鍵字extends來顯式的指明其父類。8.2.1繼承的實現其基本的語法格式如下:[修飾符]class子類名extends父類名{類體}public

classHusband{

protectedStringname;

protected

intage;

protectedStringsex;privateWifewife;}public

classWife{

protectedStringname;

protected

intage;

protectedStringsex;privateHusbandhusband;}public

classPerson{

protectedStringname;

protected

intage;

protectedStringsex;}public

classHusband{privateWifewife;}public

classWife{privateHusbandhusband;}子類可以繼承父類的所有非私有成員變量和成員方法。8.2.1繼承的實現【例8-3】創建Bird類,定義一個成員變量描述顏色。創建Pigeon類,它繼承了Bird類。在構造方法中,對繼承的color變量賦值。publicclassBird{Stringcolor;}publicclassPigeonextendsBird{publicPigeon(){color="White";}}8.2.1繼承的實現成員的繼承子類可以自行聲明新的成員變量子類可以聲明新的成員方法子類可以聲明與父類具有相同簽名的成員方法,即方法的重寫。子類可以聲明與父類中同名方法的重載方法。8.2.2繼承中的重寫重寫是指父子類之間的關系,當子類繼承父類中所有可能被子類訪問的成員方法時,如果子類的方法名與父類的方法名相同,那么子類就不能繼承父類的方法,此時,稱為子類的方法重寫了父類的方法。重寫體現了子類補充或者改變父類方法的能力。通過重寫,可以使一個方法在不同的子類中表現出不同的行為。classA{

publicvoidf(){

System.out.println("thisisfatherclass!");}}publicclassmyappextendsA{publicvoidf1(){//增加新的成員方法

System.out.println("thisissubclass!");}

publicstaticvoidmain(String[]args){

myappa=newmyapp();

a.f();

}}classA{

publicvoidf(){

System.out.println("thisisfatherclass!");}}publicclassmyappextendsA{publicvoidf(){//方法的重寫

System.out.println("thisissubclass!");}

publicstaticvoidmain(String[]args){

myappa=newmyapp();

a.f();

}}classA{

publicvoidf(){

System.out.println("thisisfatherclass!");}}publicclassmyappextendsA{publicvoidf(String

str){//方法的重載

System.out.println("thisissubclass!"+str);}

publicstaticvoidmain(String[]args){

myappa=newmyapp();

a.f("abc");

}}8.2.3使用super關鍵字子類可以繼承父類的非私有成員變量和成員方法。但若子類中聲明的成員變量與父類的成員變量同名,則子類的成員變量隱藏了父類的成員變量。若子類中聲明的成員方法與父類的成員方法同名,并且方法的返回值類型、參數個數和類型也完全相同,則子類的成員方法重寫了父類的成員方法。8.2.3使用super關鍵字若想在子類中訪問父類中被隱藏的成員變量和被重寫的成員方法,可以使用super關鍵字來操作。super關鍵字主要有以下兩種用途。1.調用父類的構造方法若要創建子類對象時希望對從父類繼承的成員變量初始化,需在子類的構造方法中利用super調用父類的構造方法。8.2.3使用super關鍵字1.調用父類的構造方法構造格式:super([參數列表]);利用super調用父類構造方法的語句必須作為子類構造方法中的第一條語句。若第一條語句不是調用父類構造方法的語句,系統會自動插入一條調用父類默認構造方法的語句,如果父類沒有不帶參數的構造方法,則會出現編譯錯誤。publicclassCircle{private

intr;publicCircle(){r=0;}publicCircle(intr1){r=r1;}publicint

getR(){returnr;}}publicclassCylinderextendsCircle{int

x,y;publicCylinder(){super();x=0;y=0;} publicCylinder(intr1,intx1,inty1){

super(r1);x=x1;y=y1;}publicstaticvoidmain(String[]args){Cylindercy=newCylinder();Cylindercy2=newCylinder(1,2,3);

System.out.println(cy);System.out.println(cy2);}半徑:0坐標:(0,0)半徑:1坐標:(2,3)publicStringtoString(){return"半徑:"+getR()+"坐標:("+x+","+y+")";}}8.2.3使用super關鍵字super關鍵字主要有以下兩種用途。2.操作被隱藏的成員變量和被重寫的成員方法具體格式:super.成員變量名super.成員方法名([參數列表])classFather{publicStringv="Father";publicStringx="Father類的成員變量x!!!";publicFather(){

System.out.println("Father構造方法被調用!");}publicvoidoutinfo(){

System.out.println("Father的outinfo方法被調用");}}publicclassSonextendsFather{publicStringv="Son";publicSon(){super();System.out.println("Son構造方法被調用!");}//覆蓋了超類成員方法outinfo()publicvoidoutinfo(){

System.out.println("Son的outinfo()方法被調用");}public

voidtest(){Stringv="哈哈哈哈!";System.out.println("------1-----");System.out.println(v);System.out.println(this.v);System.out.println(super.v);System.out.println("------2-----");System.out.println(x);System.out.println(super.x);System.out.println("------3-----");outinfo();this.outinfo();super.outinfo();}public

static

void

main(String[]args){Sonson=newSon();son.test();}}8.3多態對于同一個消息,不同類的對象可以作出不同的反應被稱為多態性。在Java中,通常使用方法的重載(Overloading)和重寫(Overriding)實現類的多態性。方法的重載是指在一個類中,出現多個方法名相同,但參數個數或參數類型不同的方法,則稱為方法的重載。Java在執行具有重載關系的方法時,將根據調用參數的個數和類型區分具體執行的是哪個方法。8.3多態【例8-5】在項目中創建MaxNumber類,定義兩個getMax()方法,分別用來比較int類型和double類型變量并獲得最大值。publicclassMaxNumber{

publicstaticint

getMax(intnumber1,intnumber2){return(number1>number2?number1:number2);}

publicclassMaxNumber{

publicstaticint

getMax(…){…}publicstaticdoublegetMax(doublenumber1,doublenumber2){return(number1>number2?number1:number2);}publicstaticvoidmain(String[]args){

int

intMax=getMax(12,21);System.out.println("12和21最大值:"+intMax);doubledoubleMax=getMax(12.0,21.0);System.out.println("12.0和21.0最大值:"+doubleMax);}}8.3多態通過方法的重寫實現多態是指一個給定類型的變量可以引用不同類型的對象,并且能夠自動地調用變量所引用的對象類型的特定成員方法。在Java中,實現這種處理機制的方法是利用指向父類對象的引用指向其子類對象,并根據該引用所指的當前子類類型,選擇執行哪一個子類中重寫的成員方法。classBaseClass{publicvoidf(){System.out.println("father");}}classDeriveClass1extendsBaseClass{publicvoidf(){System.out.println("son1");}}classDeriveClass2extendsBaseClass{publicvoidf(){System.out.println("son2");}}publicclassmyapp{publicstaticvoidmain(String[]args){

BaseClass

bc[]=newBaseClass[3];bc[0]=newBaseClass();bc[0].f();bc[1]=newDeriveClass1();bc[1].f();bc[2]=newDeriveClass2();bc[2].f();

}}fatherson1son28.4Object類8.4.1getClass()方法8.4.2toString()方法8.4.3equals()方法8.4Object類在Java中,所有的類都直接或間接繼承了java.lang.Object類。Object類是所有類的父類,是Java類層中最高層類,Java中任何一個類都是它的子類。當創建一個類時,總是在繼承,除非某個類已經指定要從其他類繼承,否則它就是從java.lang.Object類繼承而來的,如String、Integer等類都是繼承于Object類除此之外自定義的類也都繼承于Object類8.4Object類由于所有類都是Object子類,所以在定義類時,省略了extendsObject關鍵字。8.4Object類Java將所有的類都作為Object類的子類。1)一個Object類型的對象可以用來引用任何類的對象。2)可以將成員方法的參數設置為Object類型,以方便方法能夠接收參數傳遞進來的任何類型的對象。3)在Object類中提供了所有對象都應該有的行為方法,可以更好地統一這些成員方法的接口形式。8.4Object類1)getClass()方法getClass()方法是Object類的定義的方法,它會返回對象執行時的Class實例,然后使用此實例調用getName()方法可以取得類的名稱。語法如下:

getClass().getname();可以將getClass()方法與toString()方法聯合使用。8.4Object類2)toString()方法toString()方法的功能是將一個對象返回為字符串形式,返回一個String實例。在實際應用中通常重寫toString()方法,為對象提供一個特定的輸出模式。當這個類轉換為字符串或與字符串連接時,將自動調用重寫的toString()方法。在輸出引用類型變量時,也會自動調用toString()方法。8.4Object類【例8-6】重寫toString方法publicclassToStringDemo{@Override

publicStringtoString(){return"ToStringDemo類";

}publicstaticvoidmain(String[]args){

ToStringDemot=newToStringDemo();

System.out.println(t);

}}8.4Object類toString()方法重寫的幾點說明必須被聲明為public返回類型為String方法的名稱必須為toString,且沒有參數在方法體中不要使用輸出方法System.out.println()8.4Object類3)equals()方法“==”操作符可以用來比較兩個基本類型的變量值是否相同,還可以比較兩個引用是否指向同一個對象。Object類中定義的equals()方法,其默認實現也是比較兩個引用是否指向同一個對象。這在實際開發中并無任何意義。因此通常需要重寫該方法來比較實際內容是否相同。注意:Object類中的getClass()、notify()、notifyAll()、wait()等方法不能被重寫,因為這些方法被定義為final類型。8.4Object類【例8-7】在項目中創建EqualsDemo類,在主方法中使用“==”和equals()方法來比較內容相同的兩個字符串對象。publicstaticvoidmain(String[]args){ Strings1=newString("mrsoft");

Strings2=newString("mrsoft");

System.out.println(s1+"和"+s2+"指向同一對象:"+(s1==s2));System.out.println(s1+"和"+s2+"內容相同:"+(s1.equals(s2)));}publicclassCircle{protectedintr;publicCircle(){r=0;}publicCircle(intr1){r=r1;}publicboolean

equals(Circles){if(s.r==r)returntrue;elsereturnfalse;}publicstaticvoidmain(String[]args){Circlec1=newCircle();Circlec2=newCircle(0);System.out.println(c1.equals(c2));

}}補充:裝箱和拆箱在java中,數據類型總共可分為兩大種,基本數據類型(值類型)和類類型(引用數據類型)。基本類型的數據不是對象,不能作為對象調用其toString()、hashCode()、getClass()、equals()等等方法。所以在java中,針對8種基本數據類型,提供了針對每個基本數據類型的包裝類。INDEX基本數據類型包裝類

1 int Integer

2 char Character

3 float

Float

4 double

Double

5 byte

Byte

6 short

Short

7 long

Long

8 boolean

Boolean補充:裝箱和拆箱補充:裝箱和拆箱所謂裝箱,就是把基本類型用它們相應的引用類型包起來,使它們可以具有對象的特質把int型包裝成Integer類的對象,把double包裝成Double,等等。所謂拆箱,就是跟裝箱的方向相反,將Integer及Double這樣的引用類型的對象重新簡化為值類型的數據。補充:裝箱和拆箱//JDK1.5之前使用手動方式進行裝箱和拆箱的操作publicclassIntegerDemo{

publicstaticvoidmain(String[]agrs){

inti=10;

Integerj=newInteger(i); //手動裝箱操作

inti1=Value(); //手動拆箱操作

System.out.println(i1*i1);

}

}publicclassIntegerDemo02{

publicstaticvoidmain(String[]agrs){

inti=10

Integerj=i;

intk=j;

System.out.println(++k);

}

}補充:裝箱和拆箱//JDK1.5之后可自動進行的裝箱和拆箱的操作,比較方便8.5對象類型的轉換8.5.1向上轉型8.5.2向下轉型8.5.1向上轉型向上轉型:將子類對象看做是父類的對象。向上轉型是從一個較具體的類到較抽象的類之間的轉換,總是安全的。8.5.1向上轉型【例8-8】創建Parallelogram類,在類中創建Quadrangle類,并使Parallelogram類繼承Quadrangle類,然后在主方法中調用父類的draw()方法。classQuadrangle{

publicstaticvoiddraw(Quadrangleq){

//SomeSentence}}publicclassParallelogramextendsQuadrangle{

publicstaticvoidmain(String

args[]){Parallelogramp=newParallelogram();

draw(p);

}}8.5.2向下轉型向下轉型是將較抽象類轉換為較具體的類。子類對象總是父類的一個實例,但是父類對象不一定是子類的實例。因此在程序中使用向下轉型技術時,必須使用顯式類型轉換,向編譯器指明將父類對象轉換為哪一種類型的子類對象。8.5.2向下轉型【例8-9】修改例8-8,在Parallelogram類的主方法中將父類Quadrangle的對象賦值給子類Parallelogram的對象的引用變量將使程序產生錯誤。classQuadrangle{publicstaticvoiddraw(Quadrangleq){//SomeSentence}}publicclassParallelogramextendsQuadrangle{publicstaticvoidmain(String

args[]){

draw(newParallelogram());

Quadrangleq=newParallelogram();//Parallelogramp=q;

Parallelogramp=(Parallelogram)q;}}8.5.2向下轉型如果將父類對象直接賦予子類,將會發生編譯器錯誤,因為父類對象不一定是子類實例例如一個四邊形不一定就是指平行四邊形,也許它是梯形,也許是正方形,也許是其他帶有四個邊的不規則圖形。8.5.2向下轉型做向下轉型操作時,將特性范圍小的對象轉換為特性范圍大的對象肯定會出現問題,所以這時需要告知編譯器這個四邊形就是平行四邊形,將父類對象強制轉換為某個子類對象,這種方式稱為顯式類型轉換8.1接口的使用8.1.1接口的定義8.1.2接口的實現8.1接口的使用可以把用于完成特定功能的若干屬性(方法)組織成相對獨立的屬性(方法)集合,凡是需要實現這種特定功能的類,都可以繼承這個集合,并在類內使用它,這種集合就是接口。8.1.1接口的定義使用interface來定義一個接口。接口定義同類的定義類似,也是分為接口的聲明和接口體,其中接口體由變量定義和方法定義兩部分組成。定義接口的基本語法格式如下:[修飾符]interface接口名[extends父接口名列表]{[public][static][final]變量;[public][abstract]方法;}8.1.1接口的定義

表8-1定義接口的語法格式的參數說明

參數說明修飾符可選參數,用于指定接口的訪問權限,可選值為public。如果省略則使用默認的訪問權限接口名必選參數,用于指定接口名稱,接口名必須是合法的Java標識符。一般情況下,要求首字母大寫extends父接口列表可選參數,用于指定要定義的接口繼承于哪個父接口。當使用extends關鍵字時,父接口名為必選參數方法接口中的的方法只有定義而沒有被實現8.1.1接口的定義接口的特點:與抽象類一樣都是定義多個類的共同屬性使抽象概念更深入了一層,是一個“純”抽象類,它只提供一種形式,并不提供實現允許創建者規定方法的基本形式:方法名、參數列表以及返回類型,但不規定方法主體也可以包含基本數據類型的數據成員,但它們都默認為static和final8.1.1接口的定義【例8-1】創建接口

publicinterfaceICircle{doublePI=3.14159;doublegetCircumference(doubleradius);doublegetArea(doubleradius);doublegetVolume(doubleradius);}8.1.2接口的實現因為接口中的屬性都是常量,接口中的方法都是沒有方法體的抽象方法。接口定義的僅僅是實現某一特定功能的一組功能的對外接口和規范,而并沒有真正實現這個功能,這個功能的真正實現是在“繼承”這個接口的各個類中完成的,要由這些類來具體定義接口中各抽象方法的方法體。8.1.2接口的實現接口的應用:規定某些類應該實現的方法調用接口。通過定義一個能實現多個接口的類,模擬類的多重繼承。接口在定義后,就可以在類中實現該接口。8.1.2接口的實現在類中實現接口可以使用關鍵字implements基本語法格式如下所示:[修飾符]class<類名>[extends父類名][implements接口列表]{}

在非抽象類中實現接口時,方法名、返回值類型、參數的個數及類型必須與接口中的完全一致,并且必須實現接口中的所有方法。8.1.2接口的實現【例8-2】創建類實現接口publicclassCircleimplementsICircle

{@OverridepublicdoublegetCircumference(doubleradius){ return2*PI*radius;}

@OverridepublicdoublegetArea(doubleradius){ returnPI*radius*radius;}

@Override

publicdoublegetVolume(doubleradius){ return4*PI*radius*radius*radius/3.0;}}8.6instanceof判斷對象類型當在程序中執行向下轉型操作時,如果父類對象不

溫馨提示

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

評論

0/150

提交評論