Java程序設(shè)計項目案例化教程課件:Java面向?qū)ο骭第1頁
Java程序設(shè)計項目案例化教程課件:Java面向?qū)ο骭第2頁
Java程序設(shè)計項目案例化教程課件:Java面向?qū)ο骭第3頁
Java程序設(shè)計項目案例化教程課件:Java面向?qū)ο骭第4頁
Java程序設(shè)計項目案例化教程課件:Java面向?qū)ο骭第5頁
已閱讀5頁,還剩87頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

Java面向?qū)ο蟪绦蛟O(shè)計

Java面向?qū)ο笕蝿?wù)目的掌握J(rèn)ava類的定義掌握J(rèn)ava類的成員變量和成員方法的定義掌握對象的創(chuàng)建和使用掌握構(gòu)造方法創(chuàng)建和使用掌握類的繼承掌握類的訪問控制修飾符掌握類的對象轉(zhuǎn)型掌握類的多態(tài)掌握抽象類和接口面向?qū)ο笳Z言的特征計算機編程語言經(jīng)歷了由低級到高級語言的轉(zhuǎn)變過程,包括機器語言、匯編語言、高級語言,其中高級語言包括面向過程的語言和面向?qū)ο蟮恼Z句,典型的面向過程的語言C語言,面向?qū)ο笳Z言是Java語言,對象是Java語言的核心,Java語言中體現(xiàn)了“萬事萬物皆對象”。面向?qū)ο笳Z言有三大特征:封裝、繼承和多態(tài)。封裝性將數(shù)據(jù)和數(shù)據(jù)的操作放在一起形成一個封裝體,這個封裝體它可以提供對外部的訪問,同時對內(nèi)部的具體細(xì)節(jié)也實現(xiàn)了隱藏,也能控制外部的非法訪問。封裝體的基本單位是類,對象是類的實例,一個類的所有對象都具有相同的數(shù)據(jù)結(jié)構(gòu)和操作代碼。繼承性是面向?qū)ο蟮牡诙€特性,它支持代碼重用,繼承可以在現(xiàn)有類的基礎(chǔ)上進行擴展從而形成一個新的類,它們之間成為基類和派生類的關(guān)系,派生類不僅具有基類的屬性特征和行為特征而且還可以添加新的特征。采用繼承的機制來組織、設(shè)計系統(tǒng)中的類,可以提高程序的抽象程度,使之更接近于人類的思維方式,同時也通過繼承能較好地實現(xiàn)代碼重用,可以提高程序開發(fā)效率,降低維護的工作量。多態(tài)性使得多個不同的對象接收相同的消息卻產(chǎn)生不同的行為,它大大提高了程序的抽象程度和簡潔性,更重要的是,它最大限度地降低了類和程序模塊之間的耦合性,提高了類模塊的封閉性,使得它們不需了解對方的具體細(xì)節(jié),就可以很好地共同工作。這個優(yōu)點對于程序的設(shè)計、開發(fā)和維護都有很大的好處。類客觀世界物以類聚,將一些具有共同特征的的實體放在一起,形成類,如“學(xué)生”類、“教師”類、“玩具”類等。面向?qū)ο蟮某绦蚴怯脕斫鉀Q實際問題的,要求程序和現(xiàn)實世界中的實體具有一致性,那怎樣將客觀世界的實體轉(zhuǎn)變?yōu)橛嬎銠C程序設(shè)計語言,這涉及到“具體”到“抽象”的過程,將實現(xiàn)世界中的物體類的共性的特征和行為抽取出來,用計算機的程序設(shè)計語言class類來表示。類是用于描述同一類型的對象的一個抽象的概念,類中定義了這一類對象所具有的靜態(tài)(成員變量)和動態(tài)(成員方法)屬性。它是一種新的數(shù)據(jù)類型,具有封裝性。類的定義類是Java程序的基本單位,在Java中定義一個類,一般包括類的聲明和類體兩個部分。其一般格式為:類聲明{ //類體}1、類聲明:一般格式為:[修飾符]class類名[extends基類名][implements接口名]其中[]部分是可選的,修飾符包括訪問控制符和非訪問控制符,class是Java的關(guān)鍵字,表示這是一個類的定義,類名必須是合法標(biāo)識符,且首字母一般約定為大寫字母,類名指定一個有意義的名稱,extends表示繼承,該類要繼承基類名,implements表示該類還要實現(xiàn)其他接口。2、類體:類體就是類聲明后{}里面的部分,一般包括類的成員變量和類的成員方法的定義。3、最簡單的類的定義形式如下:class類名{ //成員變量定義部分;

…… //成員方法定義部分;

……}定義一個學(xué)生類:classStudent{//定義成員變量StringstrName;//學(xué)生姓名StringstrNo;//學(xué)生學(xué)號intiAge;//學(xué)生年齡doubledScore;//學(xué)生成績//定義成員方法voiddisplay(){System.out.println("學(xué)生的姓名:"+strName+"的成績"+dScore);}}類的成員變量與成員方法類的成員變量與成員方法定義一個類時,在類體中可以有成員變量和成員方法。成員變量,它體現(xiàn)的是對象的靜態(tài)屬性,而成員方法體現(xiàn)的是對象的動態(tài)行為。1、成員變量:在類中定義的變量,也稱為屬性。成員變量定義的格式:[修飾符]數(shù)據(jù)類型成員變量;1)修飾符可以使訪問控制符,也可以是static、final等關(guān)鍵字,數(shù)據(jù)類型可以是基本數(shù)據(jù)類型,也可以是引用數(shù)據(jù)類型。2)在定義類的成員變量時可以對其初始化,如果不對其初始化,Java使用默認(rèn)值對其初始化。其結(jié)果如表3.1所示:表3.1Java類的成員的變量默認(rèn)初始值成員變量類型默認(rèn)取值byte0short0int0long0Lchar‘\u0000’float0.0Fdouble0.0booleanfalse所有引用類型null3)成員變量的作用范圍為整個類體2、成員方法:1)成員方法的定義:Java的類的成員方法類似于其他語言的函數(shù),是一段完成特定功能的代碼段。成員方法的定義格式:修飾符返回值類型方法名([形式參數(shù)列表]){//方法體;}方法定義的第一行稱為方法的聲明,{}里面稱為方法體。修飾符可以使訪問控制符,也可以是static、final等關(guān)鍵字,在定義方法時要指明返回類型,返回值類型可以基本數(shù)據(jù)類型,也可以引用數(shù)據(jù)類型,如果方法不返回值,則應(yīng)顯示式聲明返回類型為void,如果一個方法需要接受外界輸入的數(shù)據(jù),則要定義形式參數(shù),如果不需要外界輸入數(shù)據(jù),形式參數(shù)列表可以為空。2)形式參數(shù)列表的定義格式:數(shù)據(jù)類型1變量名1,數(shù)據(jù)類型2變量名2,…數(shù)據(jù)類型n變量名n例如:publicvoidsetName(StringName){strName=Name;}publicvoiddisplay(){System.out.println("學(xué)生的姓名:"+strName+"的成績"+dScore);}3)方法的返回值語句return語句方法體采用return語句終止方法的運行并指定要返回的數(shù)據(jù),該值會返回給調(diào)用者。語法格式:return表達式;return關(guān)鍵字用于結(jié)束方法以及返回方法指定的類型的值,當(dāng)方法的返回值為void時,return及其返回值可以省略。4)成員方法的使用:成員方法的調(diào)用一般通過對象來調(diào)用,調(diào)用的語法格式為:對象名.方法名(實參列表);方法調(diào)用中實參列表數(shù)據(jù)類型和個數(shù)和形參列表數(shù)據(jù)一一對應(yīng)?!纠?-1】:通過案例掌握類的方法的定義和調(diào)用。classStudent{//定義成員變量StringstrName;//學(xué)生姓名StringstrNo;//學(xué)生學(xué)號intiAge;//學(xué)生年齡doubledScore;//學(xué)生成績//定義成員方法voiddisplay(){System.out.println("學(xué)生姓名:"+strName+",學(xué)號:"+strNo+",年齡:"+iAge+",成績"+dScore);}}publicclassDemo3_01{publicstaticvoidmain(String[]args){ Students1=newStudent(); s1.strName="余華"; s1.strNo="1001"; s1.iAge=18; s1.dScore=90.2; s1.display(); }}程序輸出結(jié)果:對象

從類是一種新的數(shù)據(jù)類型,封裝了對象的靜態(tài)屬性和行為,類可以看成某一類對象的模板,對象可以看成類的一個具體實例。對象的創(chuàng)建由類創(chuàng)建對象,創(chuàng)建對象一般分為兩個部分:1、聲明對象名類名對象名;2、給對象實例化:對象名=new類名([參數(shù)列表]);用new來創(chuàng)建對象并實例化,為對象申請空間,分配內(nèi)存。類名([參數(shù)列表])是調(diào)用類的構(gòu)造方法,給對象進行初始化。以上1、2兩個部分可以合并:類名對象名=new類名([參數(shù)列表]);為學(xué)生類創(chuàng)建對象yuhuaStudentyuhua=newStudent();對象的使用創(chuàng)建對象后,對象就擁有自己的成員變量和成員方法,對象通過“.”號來調(diào)用成員變量和成員方法。對象名.成員變量名;對象名.成員方法名([實參]);實參調(diào)用方法時實際傳給方法的數(shù)據(jù)?!纠?-2】:通過案例掌握類的定義和對象的創(chuàng)建。classPerson{//成員變量的定義privateintid;privateintage=20;//成員方法的定義publicvoidsetId(intParaId){id=ParaId;}publicintgetID(){returnid;}publicvoidsetAge(intParaAge){age=ParaAge;}publicintgetAge(){returnage;}publicvoiddisplay(){System.out.println(id+":"+age);}}publicclassDemo3_02{ publicstaticvoidmain(String[]args){Personp1=newPerson(); p1.setId(1001); p1.setAge(25); p1.display(); }}程序輸出結(jié)果:例3-3】:通過案例掌握類的成員變量和成員方法的調(diào)用。定義一個點類,在該類里定義二個方法,一個實現(xiàn)實現(xiàn)點到原點之間的距離,另一個實現(xiàn)任意兩個點之間的距離,創(chuàng)建對象調(diào)用該方法并輸出結(jié)果。classPointClass{intx;inty;PointClass(int_x,int_y){x=_x;y=_y;}publicdoubledisO(){returnMath.sqrt(x*x+y*y);}publicdoubledis(PointClassp2){returnMath.sqrt((x-p2.x)*(x-p2.x)+(y-p2.y)*(y-p2.y));}}publicclassDemo3_03{ publicstaticvoidmain(String[]args){ PointClassp1=newPointClass(3,4); doubled1=p1.disO(); System.out.println("p1到原點的距離:"+d1); PointClassp2=newPointClass(5,9); doubled2=p1.dis(p2); System.out.println("p1到p2的距離:"+d2); }}程序運行的結(jié)果:類的構(gòu)造方法在類體中有一種特殊的方法,即構(gòu)造方法,它在創(chuàng)建對象時自動調(diào)用,構(gòu)造方法的作用對對象進行初始化。構(gòu)造方法具有如下特點:1)構(gòu)造方法名與類名相同。2)構(gòu)造方法沒有返回值,返回值類型為空,即使void也不寫。3)構(gòu)造方法可以有多個形式參數(shù),也可以無參。4)一個類中可以同時定義多個構(gòu)造方法,調(diào)用構(gòu)造方法時,系統(tǒng)會根據(jù)參數(shù)個數(shù)及類型尋找匹配的構(gòu)造方法。5)如果類中沒有定義構(gòu)造方法,系統(tǒng)會提供默認(rèn)一個無參的構(gòu)造方法,其方法體為空,形式如下:類名(){}6)如果類中已經(jīng)定義構(gòu)造方法,系統(tǒng)不再提供默認(rèn)無參構(gòu)造方法。7)構(gòu)造方法的調(diào)用與成員方法的調(diào)用不同,它是在創(chuàng)建對象時自動調(diào)用,即格式:new類名(參數(shù));【例3-4】:通過案例掌握構(gòu)造方法的定義和調(diào)用。classPerson{Stringname;intage;Person(){name="Lisi";age=20;}Person(StringstrName,intiAge){name=strName;age=iAge;}Person(StringstrName){name=strName;age=20;}}publicclassDemo3_04{ publicstaticvoidmain(String[]args){ Personp1=newPerson();//調(diào)用第一個構(gòu)造方法 Personp2=newPerson("zhao",20);//調(diào)用第二個構(gòu)造方法 Personp3=newPerson("zhao");//調(diào)用第三個構(gòu)造方法 }}方法的重載方法重載通常用于完成一組任務(wù)相似,但參數(shù)的不同的方法。Java中方法的重載是指一個類中可以定義有相同的名字,但參數(shù)不同的多個方法。調(diào)用時,會根據(jù)不同的參數(shù)表選擇相應(yīng)的方法。方法的重載具有的特點:1、方法名相同2、方法的參數(shù)不同,參數(shù)不同包括:參數(shù)的個數(shù)或者類型不同3、跟方法的返回值無關(guān),返回值類型可以相同也可以不相同【例3-5】:通過案例掌握方法重載的定義和調(diào)用。classPerson{privateintid;privateintage;Person(){id=1001;age=25;}Person(int_id,int_age){ id=_id; age=_age;}publicintgetAge(){returnage;}publicvoidsetAge(inti){age=i;}publicintgetId(){returnid;}voidinfo(){System.out.println("myidis:"+id);}voidinfo(Stringt){System.out.println(t+"id"+id);}}publicclassDemo3_05{ publicstaticvoidmain(String[]args){ Personp=newPerson(); Personp2=newPerson(2,500); (); ("ok"); }}程序輸出的結(jié)果:方法的重載在調(diào)用時,根據(jù)實參和形參的對應(yīng)關(guān)系找到類型相匹配的關(guān)系,如果沒有找到類型相匹配的方法,Java編譯器會找可以兼容的類型來調(diào)用(根據(jù)數(shù)據(jù)類型轉(zhuǎn)換原則,自動轉(zhuǎn)換的數(shù)據(jù)類型可以來調(diào)用)。例如:【例3-6】:通過案例掌握方法重載,如果沒有找到類型匹配的方法,通過兼容的類型來調(diào)用。classArea{doublegetArea(doubler){ return3.14*r*r;}doublegetArea(floatx,inty){ returnx*y;} floatgetArea(intx,floaty){ returnx*y; }}publicclassDemo3_06{ publicstaticvoidmain(String[]args){ Areaa1=newArea(); System.out.println(a1.getArea(2));//調(diào)用第一個getArea方法 System.out.println(a1.getArea(2.5f,3));//調(diào)用第二個getArea方法 System.out.println(a1.getArea(3,2.5f));//調(diào)用第三個getArea方法}}程序運行的結(jié)果:a1對象調(diào)用getArea的三個方法,其中a1.getArea(2)調(diào)用第一個getArea方法,根據(jù)數(shù)據(jù)類型轉(zhuǎn)換原則,2數(shù)值默認(rèn)是int整型常量,將整型常量轉(zhuǎn)換為double型數(shù)據(jù)類型,屬于自動轉(zhuǎn)換。如果將a1.getArea(2.5f,3)中的2.5后面的f去掉,則編譯不成功,因為2.5數(shù)值屬于double型數(shù)據(jù),將double型數(shù)據(jù)賦給float型數(shù)據(jù),需要強制轉(zhuǎn)換。this關(guān)鍵字this是Java的一個關(guān)鍵字,表示當(dāng)前對象的引用,主要應(yīng)用在:1、this調(diào)用本類的成員變量:this可以調(diào)用本類的成員變量,其語法格式:this.成員變量類的成員變量和方法中的形式參數(shù)重名的情況下,采用this關(guān)鍵字來區(qū)別。classRectangle{privatedoublelength;privatedoublewidth;Rectangle(doublelength,doublewidth){this.length=length;this.width=width;}}this.length表示當(dāng)前對象this訪問成員變量length,而不是形式參數(shù)變量length。2、使用this調(diào)用本類的其他構(gòu)造方法在構(gòu)造方法中用this調(diào)用本類中的其他構(gòu)造方法,此時this指代本類類名,調(diào)用時要放在構(gòu)造方法的首行。其語法格式:this(參數(shù)列表);此處的參數(shù)列表和被調(diào)用的構(gòu)造方法參數(shù)列表是匹配的,如下例:classPerson{intage;Stringname;publicPerson(){}publicPerson(intage){this.age=age;}publicPerson(intage,Stringname){this(age);//調(diào)用了第二個構(gòu)造方法=name;}}3、this可以看作一個變量,它的值是當(dāng)前對象的引用【例3-7】:通過案例掌握this關(guān)鍵字的使用。publicclassDemo3_07{ inti=0; Demo3_07(inti){this.i=i;} Demo3_07increament(){i++;returnthis;//返回的是當(dāng)前的對象}voiddisplay(){System.out.println("i="+i);}publicstaticvoidmain(String[]args){ Demo3_07demo07=newDemo3_07(100);demo07.increament().increament().display();}}程序運行結(jié)果:static關(guān)鍵字static是Java的關(guān)鍵字,static表示“全局”或者“靜態(tài)”的意思,可以用來修飾類的成員變量和類的成員方法。1、修飾類的成員變量:在類中,用static聲明的成員變量為靜態(tài)成員變量,它為該類的公用變量,在第一次使用時被初始化,對于該類的所有對象來說,static成員變量只有一份。語法格式:static數(shù)據(jù)類型變量名;2、修飾類的成員方法:用static聲明的方法為靜態(tài)方法,在調(diào)用該方法時,不會將對象的引用傳遞給它,所以在static方法中不可以訪問非static的成員??梢酝ㄟ^對象引用或類名(不需要實例化)訪問靜態(tài)成員。3、語法格式:修飾符static返回值類型方法名(參數(shù)列表){//方法體}4、static的使用【例3-8】:通過案例掌握static關(guān)鍵字的使用。publicclassDemo3_08{ privatestaticintsid=0;privateStringname;intid;Demo3_08(Stringname){=name;id=sid++;}publicvoidinfo(){System.out.println("Mynameis"+name+"No."+id);}publicstaticvoidmain(Stringarg[]){ Demo3_08.sid=100; Demo3_08demo08_1=newDemo3_08("demo08_1"); demo08_1.sid=2000;Demo3_08demo08_2=newDemo3_08("demo08_1");demo08_1.info();demo08_2.info();}}程序運行的結(jié)果:包如何有效組織管理Java程序中的涉及到各個類,Java提供了包機制,用于區(qū)別類名的命名空間。包的概念包(package)是Java類的管理機制,包的作用:1、把功能相似或相關(guān)的類或接口組織在同一個包中,方便類的查找和使用。2、包采用了層次結(jié)構(gòu),如同文件夾一樣,采用了樹形目錄的存儲方式。3、同一個包中的類名字是不同的,不同的包中的類的名字是可以相同的,當(dāng)同時調(diào)用兩個不同包中相同類名的類時,應(yīng)該加上包名加以區(qū)別。因此,包可以避免名字沖突。4、包也限定了訪問權(quán)限,擁有包訪問權(quán)限的類才能訪問某個包中的類。import語句import語句是引入語句,用戶在編寫程序時,通過import語句導(dǎo)入包中的類,用戶程序才可以直接使用該類。import語句導(dǎo)入包中的類,有兩種情況:1、語法格式為:import包名.子包名.*;“*”表示本層次的所有類。importjava.util.*;//將java.util包下所有的類都引入進來importjava.awt.*;//將java.awt包下所有的類都引入進來2、語法格式為:import包名.子包名.具體的類名;importjava.util.Scanner;//只引入java.util包下Scanner類注:JDK中java.lang包下所有的類自動引入,不要采用import語句引入。package語句package語句作為Java源程序的第一條語句,指明該文件中定義的類所在的包,若缺省該語句,則指定為無名包。包語句的語法格式為:packagepkg1[.pkg2[.pkg3…]];package是Java的關(guān)鍵字,pkg1是包名,pkg2是子包名,pkg3是子包中的子包。Java編譯器把包對應(yīng)于文件系統(tǒng)的目錄管理,package語句中,用“.”來指明包的層次,包的層次和操作系統(tǒng)的文件夾是一一對應(yīng)的。例如語句:packagenet.ahiec.www;則該程序通過編譯后所有的類位于.\net\ahiec\www目錄下?!纠?-9】:通過案例掌握package、import關(guān)鍵字的使用。求判斷一個點是否在圓內(nèi),并求圓的面積。packagenet.ahiec.www;classPointClass{intx;inty;PointClass(int_x,int_y){x=_x;y=_y;}}classCircleClass{PointClasso;intr;CircleClass(PointClass_o,int_r){o=_o;r=_r;}booleancontains(PointClassp){ intx=p.x-o.x; inty=p.y-o.y; if(x*x+y*y>r*r) returnfalse; else returntrue;}publicdoubleCircleArea(){return3.14*r*r;}}publicclassDemo3_09{ publicstaticvoidmain(String[]args){PointClasso=newPointClass(0,0);PointClassp=newPointClass(2,3);intr=4;CircleClassc1=newCircleClass(o,r);if(c1.contains(p)){System.out.println("p點在圓內(nèi)");}else{System.out.println("p點在圓外");}System.out.println(c1.CircleArea());}}該程序編譯:在dos命令提示符下輸入:javac–d.TestPackage.java其中–d是指設(shè)置編譯生成的.class放到哪一個目錄,“.”號表示當(dāng)前文件夾。如果編程成功,則在當(dāng)前文件夾下形成三個子文件夾.\net\ahiec\www\下形成三個class文件。如下圖:程序運行的結(jié)果:在dos命令提示符下輸入:javanet.ahiec.www.TestPackage注意:如果在其他程序中引用PointClass和CircleClass類,有一下幾種方法:1、采用引入的方法:1)引入具體類名:importnet.ahiec.www.PointClass;importnet.ahiec.www.CircleClass;2)采用“*”importnet.ahiec.www.*;2、在程序中寫全名net.ahiec.www.PointClassp1=newnet.ahiec.www.PointClass();net.ahiec.www.CircleClassc1=newnet.ahiec.www.Circle(p1,3);3、訪問位于同一個包中的類不需要引入。常用包JDK給程序開發(fā)人員提供了豐富的類,這些類都在相關(guān)的包中,下面列舉出一些常用的包,如表3.2所示,這些包我們有的已經(jīng)接觸,有的會在后續(xù)的學(xué)習(xí)中會用到。表3.2常用的包包名說明java.lang提供利用Java編程語言進行程序設(shè)計的基礎(chǔ)類。java.utilJAVA的一些實用工具包,如Date,Calendar,ArrayListjava.awt包含用于創(chuàng)建用戶界面和繪制圖形圖像的所有類。java.awt.event提供處理由AWT組件所激發(fā)的各類事件的接口和類。javax.swing提供一組“輕量級”(全部是Java語言)組件,盡量讓這些組件在所有平臺上的工作方式都相同。java.io輸入流和輸入流相的類。java.sql提供訪問并處理存儲在數(shù)據(jù)源中的數(shù)據(jù)的API。提供用于網(wǎng)絡(luò)應(yīng)用程序的類。訪問權(quán)限Java的訪問權(quán)限是指能夠控制類、成員變量、方法的使用權(quán)限的關(guān)鍵字。分為類的成員訪問權(quán)限和類的訪問權(quán)限。1、類的成員訪問權(quán)限在一個類的內(nèi)部,其成員(包括成員變量和成員方法)能否被其他類所訪問,取決于該成員的修飾詞。Java的類成員訪問權(quán)限修飾詞有四類:private,無(默認(rèn)情況下),protected和public。其權(quán)限控制如表3.3所示:表3.3成員的訪問權(quán)限

同一個類中同一個包中不同包中的子類不同包中的非子類private可以訪問

默認(rèn)可以訪問可以訪問

protected可以訪問可以訪問可以訪問

public可以訪問可以訪問可以訪問可以訪問2、類的訪問權(quán)限對類的訪問權(quán)限只有兩種,一種是加public修飾符的訪問權(quán)限,另一種不加任何訪問權(quán)限修飾符,默認(rèn)的訪問權(quán)限。1)加public修飾符的類訪問權(quán)限例如:publicclassBB{//類體}用public修飾的類稱為公共類,公共類可以被任何包中的類訪問。2)不加任何訪問權(quán)限修飾符例如:classBB{//類體}Java類前面不加任何訪問權(quán)限修飾符,稱為友好類(friendly),只能在同一個包中類才可以訪問。【例3-10】:通過案例掌握訪問權(quán)限修飾符的使用。classStudent{protectedStringschool;privateStringname;//僅限于Student類訪問。publicintage;Student(Stringname,intage,Stringschool){=name;this.age=age;this.school=school;}}publicclassDemo3_10{ publicstaticvoidmain(String[]args){Students=newStudent("li",25,"chc");System.out.println();//name定義時的權(quán)限是private,在Monitor中不能訪問。System.out.println(s.age);//可以訪問age成員System.out.println(s.school);//可以訪問school成員}}在上例中System.out.println();會發(fā)生編譯錯誤,如圖3.18所示,因為在Monitor中不能訪問name,它是private,只能在Student類中訪問。繼承前面介紹了類的第一大特性,類的封裝性,這一節(jié)講類的繼承性,繼承是面向?qū)ο笤O(shè)計的又一個重要特性,繼承產(chǎn)生類的層次,通過繼承能夠方便地復(fù)用代碼,提高開發(fā)的效率。如下圖所示:交通工具的類層次。上圖交通工具類屬于基類,它有三個子類,分別是汽車類、飛機類和輪船類,而汽車類又分為三個子類:公交車類、小汽車類和卡車類,小汽車類也有三個子類構(gòu)成,分別是轎車類、跑車類和面包車類。擁有子類的類稱為父類或稱基類,一個父類可以擁有多個子類,比如小汽車類擁有三個子類:轎車類、跑車類和面包車類,Java實現(xiàn)的是單繼承,也就是一個子類只能屬于一個父類。繼承使描述事物更加抽象化、簡單。跑車具有小汽車所有的屬性,同時還有自己特有的屬性,跑得快。在跑車類里面添加“跑得快”屬性就可以了,其他屬性通過繼承父類的小汽車而獲得。繼承的引入定義一個Wife和Husband類,兩個類具有共同的特性,姓名、年齡和身份證號,定義如下: classWife{ privateStringname; privateintage; privatelongID; privateHusbandhusband; } classHusband{ privateStringname; privateintage; privatelongID; privateWifewife; }從Wife和Husband兩個類除了各自的husband、wife屬性不同外其它都相同,這樣會產(chǎn)生程序代碼冗余,類的繼承可以去除代碼冗余,實現(xiàn)代碼復(fù)用。將Wife和Husband兩個類共同特性抽取出來,形成一個新類Person類,如下:classPerson{privateStringname;privateintage;privatelongID;}再讓W(xué)ife和Husband類繼承Person類,只要在Wife和Husband類寫上自己獨有的特性就可以,共有的特性從Person繼承過來。classWifeextendsPerson{privateHusbandhusband;}classHusbandextendsPerson{privateWifewife;}對于Wife、Husband使用繼承后,除了代碼量的減少,還能夠非常明顯地看到他們之間的關(guān)系。繼承的語法格式:[類修飾符]class子類extends父類{//類體}extends是關(guān)鍵字,表示“繼承”的意思,子類又稱派生類,父類又稱基類(超類),類修飾符可以是public,也可以是默認(rèn)。子類繼承父類具有以下特點:1)子類繼承父類,子類擁有父類非private的屬性和方法2)子類可以擁有自己屬性和方法,即子類可以對父類進行擴展。3)子類可以用自己的方式實現(xiàn)父類的方法(重寫)。4)一個子類只能屬于一個父類,一個父類擁有多個子類。類的繼承【例3-11】:通過案例掌握類的繼承的定義和特性。classPerson{privateStringname;privateintage;publicvoidsetName(Stringname){ =name;}publicvoidsetAge(intage){ this.age=age;}publicStringgetName(){ returnname;}publicintgetAge(){ returnage;}}classStudentextendsPerson{privateStringschool;publicStringgetSchool(){ returnschool;}publicvoidsetSchool(Stringschool){ this.school=school;}}publicclassDemo3_11{ publicstaticvoidmain(String[]arg){ Studentstudent=newStudent(); student.setName("John"); student.setAge(18); student.setSchool("SCH"); System.out.println(student.getName()); System.out.println(student.getAge()); System.out.println(student.getSchool()); }}程序運行的結(jié)果:成員變量的隱藏繼承中,子類定義了與父類相同的成員變量時,就會發(fā)生子類對父類變量的隱藏。對于子類對象來說,父類中的同名成員變量被隱藏起來,子類優(yōu)先使用自己的成員變量。如下例:【例3-12】:通過案例掌握類繼承中的變量隱藏特性。classTestA{intn=10;}publicclassDemo3_12extendsTestA{ intn=100; publicstaticvoidmain(String[]args){ Demo3_12demo12=newDemo3_12(); System.out.println(demo12.n); }}程序運行的結(jié)果:子類TestB從父類TestA繼承了成員變量n,但在子類類體中又定義了成員變量n,此時實際上子類它擁有兩個同名的成員變量n,通過子類創(chuàng)建的對象引用該成員時,引用的是子類類體中定義的成員,從父類繼承的成員被隱藏,運行結(jié)果輸入是100。繼承方法的重寫在實際開發(fā)過程中,經(jīng)常遇到在子類中要重新定義父類的某一個方法,也就是子類根據(jù)需要對父類中繼承來的方法進行重寫。方法一旦重寫后,對于子類對象,調(diào)用的是自己的成員,覆蓋父類的成員方法。方法重寫也就方法覆蓋。子類對父類的方法重寫滿足:1)方法名相同2)方法的參數(shù)列表相同3)方法的返回值相同4)重寫方法不能使用比被重寫方法更嚴(yán)格的訪問權(quán)限【例3-13】:通過案例掌握類繼承中的方法重寫特性。classPerson{privateStringname;privateintage;publicvoidsetName(Stringname){=name;}publicvoidsetAge(intage){this.age=age;}publicStringgetName(){returnname;}publicintgetAge(){returnage;}publicStringgetInfo(){return"Name:"+name+"\n"+"age:"+age;}}classStudentextendsPerson{privateStringschool;publicStringgetSchool(){returnschool;}publicvoidsetSchool(Stringschool){this.school=school;}publicStringgetInfo(){return"Name:"+getName()+"\nage:"+getAge()+"\nschool:"+school; }}publicclassDemo3_13{ publicstaticvoidmain(String[]args){Studentstudent=newStudent();Personperson=newPerson();person.setName("none");person.setAge(1000);student.setName("John");student.setAge(18);student.setSchool("SCH");System.out.println(person.getInfo());System.out.println(student.getInfo());}}程序運行的結(jié)果:在子類中重寫了父類的getInfo方法,當(dāng)子類對象調(diào)用getInfo方法時,優(yōu)先運行子類的getInfo方法。super關(guān)鍵字如果子類和父類有相同的成員變量和成員方法時,子類會隱藏或覆蓋父類的成員變量和成員方法,使用子類自己的成員變量和成員方法,但這時如果子類想訪問父類的成員變量和成員方法,采用super關(guān)鍵字。語法格式:super.父類的成員變量名;super.父類成員方法名;【例3-14】:通過案例掌握類繼承中的super關(guān)鍵字的使用。classCountry{Stringname;voidvalue(){name="China";}}classCityextendsCountry{Stringname;voidvalue(){name="hefei";super.value();//調(diào)用父類的成員方法System.out.println(name);System.out.println();//調(diào)用父類的成員屬性}}publicclassDemo3_14{ publicstaticvoidmain(String[]args){ Cityc=newCity(); c.value(); }}子類City類繼承父類Country類,子類中value方法覆蓋了父類的value方法,通過super關(guān)鍵字調(diào)用了父類的value方法和name屬性。程序運行的結(jié)果:繼承中構(gòu)造方法創(chuàng)建對象是通過調(diào)用構(gòu)造方法來完成,類的繼承中,創(chuàng)建子類對象時,先要創(chuàng)建父類對象,有了父類對象,然后才能完成創(chuàng)建子類對象。也就是子類的構(gòu)造過程中必須調(diào)用其基類的構(gòu)造方法。它分為隱式調(diào)用和顯示調(diào)用兩種方式。1、隱式調(diào)用父類構(gòu)造方法如果子類構(gòu)造方法中沒有顯示調(diào)用父類的構(gòu)造方法,系統(tǒng)提供默認(rèn)調(diào)用父類無參構(gòu)造方法。2、顯示調(diào)用父類構(gòu)造方法子類的構(gòu)造方法使用super語句顯示調(diào)用父類的構(gòu)造方法,super語句必須寫在子類構(gòu)造方法的第一行。語法格式:super(參數(shù)列表);該語句是調(diào)用父類的構(gòu)造方法,根據(jù)參數(shù)列表的匹配性來調(diào)用相應(yīng)的構(gòu)造方法?!纠?-15】:通過案例掌握類繼承中隱式、顯示調(diào)用父類構(gòu)造方法的使用。classSuperClass{privateintn;SuperClass(){System.out.println("SuperClass()");}SuperClass(intn){System.out.println("SuperClass(intn)");this.n=n;}}classSubClassextendsSuperClass{privateintn;SubClass(){super(300);//顯示調(diào)用父類的構(gòu)造方法System.out.println("SuperClass");}SubClass(intn){//隱式調(diào)用父類的構(gòu)造方法System.out.println("SubClass(intn):"+n);this.n=n;}}publicclassDemo3_15{ publicstaticvoidmain(Stringargs[]){ SubClasssc1=newSubClass(); SubClasssc2=newSubClass(200); }}該程序創(chuàng)建對象sc1的時候調(diào)用SubClass()構(gòu)造方法,該構(gòu)造方法的第一句:super(300);顯示地調(diào)用了父類的構(gòu)造方法SuperClass(intn),將300的值傳遞給n,父類的構(gòu)造方法調(diào)用結(jié)束后,產(chǎn)生父類對象,然后再做子類構(gòu)造方法以下的語句,完成對象sc1的創(chuàng)建。創(chuàng)建對象sc2的時候,調(diào)用子類的構(gòu)造方法SubClass(intn),將實參200的值傳給形參n,該構(gòu)造方法第一句沒有super語句,則采用隱式調(diào)用父類的無參構(gòu)造方法SuperClass(),調(diào)用結(jié)束后,才繼續(xù)做SubClass(intn)構(gòu)造方法以下的語句。程序運行的結(jié)果:在子類構(gòu)造方法中調(diào)用父類的構(gòu)造方法:1、子類的構(gòu)造過程中必須調(diào)用其基類的構(gòu)造方法。2、子類可以在自己的構(gòu)造方法中使用super(argument_list)調(diào)用基類的構(gòu)造方法。必須寫在子類構(gòu)造方法的第一行。3、如果子類的構(gòu)造方法中沒有顯示的調(diào)用基類的構(gòu)造方法,則系統(tǒng)默認(rèn)調(diào)用基類的無參數(shù)構(gòu)造方法。4、如果子類構(gòu)造方法中既沒有顯示調(diào)用基類構(gòu)造方法,而基類又沒有無參數(shù)的構(gòu)造方法,則編譯出錯。final關(guān)鍵字在面向?qū)ο蟪绦蛟O(shè)計中,子類可以利用重載修改父類的那里繼承來的某些數(shù)據(jù)成員和成員方法,這給程序設(shè)計帶來方便的同時,也給系統(tǒng)的安全性帶來了威脅。為此,Java語言提供了final修飾符來保證系統(tǒng)的安全性。final關(guān)鍵字可以修飾類、方法以及變量,用這個關(guān)鍵字進行修飾的類或類的成員方法和變量都是不能改變的。1、final修飾類的成員方法用final修飾類的成員方法,稱最終方法,該方法不能被重寫。主要防止任何繼承類修改此方法,保證了程序的安全性和正確性。其語法格式:訪問權(quán)限final方法名(參數(shù)列表){ //方法體}2、final修飾類final修飾類最終類,該類不能被繼承,該類中所定義的方法自動成為final方法。其語法的格式:finalclass類名{ //類體}3、final修飾變量final修飾的變量可以是類的成員變量和局部變量。對于一個final修飾的變量,如果是基本數(shù)據(jù)類型的變量,則其數(shù)值一旦在初始化之后便不能更改;如果是引用類型的變量,則在對其初始化之后便不能再讓其指向另一個對象。其語法格式:限定修飾符final數(shù)據(jù)類型變量名=初始值;例如:publicfinaldoublePI=3.14;【例3-16】:通過案例掌握final關(guān)鍵字的使用。指出下列程序的錯誤finalclassT{ finalinti=8; publicfinalvoidm(){

}}classTTextendsT{//T是final類,不能被繼承 publicvoidm(){//m方法是final方法,不能被重寫

}}publicclassDemo3_16{ publicstaticvoidmain(String[]args){ Tt=newT(); t.i=8;//i是final變量,不能被改變或重寫賦值 }}程序編譯出現(xiàn)如下錯誤:多態(tài)是因為java語言中引入了封裝、繼承、多態(tài)性的面向?qū)ο髾C制,而多態(tài)性是面向?qū)ο蟮木幊陶Z言所必須具備的,若一個語言不支持多態(tài),則不能稱面向?qū)ο蟮?,只支持類而不支持多態(tài),稱基于對象的,但不能稱面向?qū)ο蟮?,如VB,Ada等語言。多態(tài)性機制具有一些很重要的作用:隱藏了程序的實現(xiàn)細(xì)節(jié),使得代碼能夠模塊化;擴展代碼模塊,實現(xiàn)代碼重用;接口重用:為了類在繼承和派生的時候,保證使用家族中任一類的實例的某一屬性時的正確調(diào)用,這在實現(xiàn)龐大的項目或工程編程中起著非常關(guān)鍵的作用。多態(tài)性是java語言的精華,熟練掌握了多態(tài),是成為java高手的最重要的條件。多態(tài)的引入多態(tài)的概念:多態(tài)是從希臘語而來,在字面上的定義是:“一個界面,多種形態(tài)”(即多種形式或方法)。下面舉幾個實例來說明:【例3-17】:計算機的光驅(qū)控制。要操作光驅(qū),需要按一下光驅(qū)面板上的一個按鍵,此時倉門打開,托架滑出。放入一張光盤,再按一下鍵,托架收回,倉門關(guān)閉。此時,光驅(qū)被啟動,或者播放音樂,或者訪問數(shù)據(jù),無論是哪家企業(yè)生產(chǎn)的光驅(qū),其操作方法都一樣,就是說,一個“界面”(一種交互方式),“多種方法”(不同的生產(chǎn)商)。這樣處理只要知道一個光驅(qū)的界面使用情況,不同的生產(chǎn)商所生產(chǎn)的不同的光驅(qū)品牌我都會使用(雖然我不知道每個光驅(qū)的具體實現(xiàn)機理)?!纠?-18】:錄音機的控制。錄音機的控制如圖3.3所示一排按鈕:上面是錄音機的一些鍵,以后出現(xiàn)的錄象機、VCD、DVD等也都有這樣的一些鍵,這些鍵的功能非常相似。錄音機、錄象機、VCD、DVD在機械原理和其他原理應(yīng)該有很大的差異,但它們的播放接口非常相似,一開始會使用錄音機了,以后使用錄象機、VCD、DVD就很容易了。這樣處理只要了解一種播放接口,就可以知道使用多種播放器,即使這些播放器有著不同的實現(xiàn)機理。通過【例3-17】、【例3-18】可以簡單歸納:利用統(tǒng)一的接口對不同的對象進行控制。java程序中,同一個名稱可以有多個不同實現(xiàn),這就降低了程序(工程)的復(fù)雜度?!纠?-19】:如圖3.4所示,是一個類繼承層次結(jié)構(gòu)圖,假設(shè)每個類都有一個成員函數(shù)display(),用來在屏幕上顯示該類表示的窗口(不同類型的窗口有著不同的顯示方式)。假設(shè)w是Window類的引用,此時,無論w是指向MenuWindow還是MessageWindow對象,(注意:基類類型的引用可以指向任何基類對象或派生類對象)代碼:w.display();都可以正確執(zhí)行。如果w實際指向MeunWindow對象,那么調(diào)用的是MeunWindow的display()函數(shù);如果w實際指向MessageWindow對象,那么調(diào)用的是MessageWindow的display()函數(shù)。體現(xiàn)了利用統(tǒng)一的接口對不同的對象進行控制原理。在java程序中實現(xiàn)多態(tài)性,必須要掌握以下幾點:對象轉(zhuǎn)型、抽象類和抽象方法、接口的相關(guān)知識。抽象類和抽象方法以及接口在上面我們已經(jīng)闡述過來,下面我們重點闡述對象轉(zhuǎn)型。instanceof關(guān)鍵字instanceof是Java特有的一個運算符,它主要用來判斷在運行時某一個對象是否為該類或該類子類的一個實例。返回一個boolean類型的值。其語法格式為:對象引用instanceof類如果該對象是該類創(chuàng)建的或者是該類子類創(chuàng)建的對象,返回值為true,否則,返回值為false?!纠?-20】:instanceof關(guān)鍵字的使用。classAnimal{ publicStringname; Animal(Stringname){ =name; }}classCatextendsAnimal{ publicStringeyesColor; Cat(Stringn,Stringc){ super(n); eyesColor=c; }}classDogextendsAnimal{ publicStringfurColor; Dog(Stringn,Stringc){ super(n); furColor=c; }}publicclassDemo3_20{ publicstaticvoidmain(String[]args){ Animala=newAnimal("name"); Catc=newCat("catname","blue"); Dogd=newDog("dogname","black"); System.out.println(ainstanceofAnimal); System.out.println(cinstanceofAnimal); System.out.println(dinstanceofAnimal); System.out.println(ainstanceofCat);}}程序運行的結(jié)果:對象轉(zhuǎn)型基本數(shù)據(jù)類型轉(zhuǎn)換分為自動轉(zhuǎn)換和強制轉(zhuǎn)換,而對象也具有轉(zhuǎn)型功能,分為向下轉(zhuǎn)型和向上轉(zhuǎn)型。向上轉(zhuǎn)型:父類對象的引用或者叫基類對象的引用指向子類對象,反之叫向上轉(zhuǎn)型。對象轉(zhuǎn)型具有以下特點:1、一個基類的引用類型變量可以指向其子類的對象。2、一個基類的引用不可以訪問其子類對象新增加的成員(屬性和方法)3、可以使用引用變量instanceof類名來判斷該引用型變量所“指向”的對象是否屬于該類或該類的子類?!纠?-21】:對象轉(zhuǎn)型的使用。classAnimal{publicStringname;Animal(Stringname){ =name; }}classCatextendsAnimal{ publicStringeyesColor; Cat(Stringn,Stringc){ super(n); eyesColor=c;}}classDogextendsAnimal{ publicStringfurColor;Dog(Stringn,Stringc){ super(n);furColor=c; }}publicclassDemo3_21{publicvoidf(Animala){ System.out.println("name:"+); if(ainstanceofCat){ Catcat=(Cat)a; System.out.println(""+cat.eyesColor+"eyes"); }elseif(ainstanceofDog){ Dogdog=(Dog)a; System.out.println(""+dog.furColor+"fur"); }}publicstaticvoidmain(String[]args){ Demo3_21demo21=newDemo3_21(); Animala=newAnimal("name"); Catc=newCat("catname","blue"); Dogd=newDog("dogname","black"); demo21.f(a); demo21.f(c); demo21.f(d);}}程序運行的結(jié)果:多態(tài)即同一消息可以根據(jù)發(fā)送對象的不同而采用多種不同的行為方式。(發(fā)送消息就是方法調(diào)用),實現(xiàn)多態(tài)的技術(shù)稱為:動態(tài)綁定(dynamicbinding),是指在執(zhí)行期間判斷所引用對象的實際類型,根據(jù)其實際的類型調(diào)用其相應(yīng)的方法。多態(tài)的好處:1、可替換性(substitutability)。多態(tài)對已存在代碼具有可替換性。例如,多態(tài)對圓Circle類工作,對其他任何圓形幾何體,如圓環(huán),也同樣工作。2、可擴充性(extensibility)。多態(tài)對代碼具有可擴充性。增加新的子類不影響已存在類的多態(tài)性、繼承性,以及其他特性的運行和操作。實際上新加子類更容易獲得多態(tài)功能。例如,在實現(xiàn)了圓錐、半圓錐以及半球體的多態(tài)基礎(chǔ)上,很容易增添球體類的多態(tài)性。3、接口性(interface-ability)。多態(tài)是超類通過方法簽名,向子類提供了一個共同接口,由子類來完善或者覆蓋它而實現(xiàn)的。如圖8.3所示。圖中超類Shape規(guī)定了兩個實現(xiàn)多態(tài)的接口方法,computeArea()以及computeVolume()。子類,如Circle和Sphere為了實現(xiàn)多態(tài),完善或者覆蓋這兩個接口方法。4、靈活性(flexibility)。它在應(yīng)用中體現(xiàn)了靈活多樣的操作,提高了使用效率。5、簡化性(simplicity)。多態(tài)簡化對應(yīng)用軟件的代碼編寫和修改過程,尤其在處理大量對象的運算和操作時,這個特點尤為突出和重要。一個Java程序中使用了多態(tài),基本要滿足三個條件:1)要有繼承;2)要有方法的重寫;3)要有對象轉(zhuǎn)型,父類引用指向子類對象?!纠?-22】:多態(tài)的使用。classAnimal{privateStringname;Animal(Stringname){=name;}publicvoidbarking(){ System.out.println("叫聲......");}}classBirdextendsAnimal{ privateStringfeatherColor; Bird(Stringname,Stringcolor){ super(name);featherColor=color; }publicvoidbarking(){ System.out.println("鳥叫聲......");}}classCatextendsAnimal{ privateStringeyesColor; Cat(Stringname,Stringcolor){super(name);eyesColor=color;} publicvoidbarking(){ System.out.println("貓叫聲......"); }}classDogextendsAnimal{privateStringhairColor;Dog(Stringname,Stringcolor){super(name);hairColor=color;}publicvoidbarking(){ System.out.println("狗叫聲......");}}classLady{ privateStringname; privateAnimalanimal; Lady(Stringname,Animalanimal){ =name;this.animal=animal; } publicvoidPetBarking(){animal.barking();}}publicclassDemo3_22{ publicstaticvoidmain(Stringargs[]){ Birdbird=newBird("pigeon","white"); Catcat=newCat("mimi","blue"); Dogdog=newDog("bigYellow","Yellow"); Ladylady1=newLady("lady1",bird); Ladylady2=newLady("lady2",cat); Ladylady3=newLady("lady3",dog); lady1.PetBarking(); lady2.PetBarking(); lady3.PetBarking();}}程序運行的結(jié)果:【例3-23】:使用抽象類實現(xiàn)例子【3-22】多態(tài)功能。abstractclassAnimal{privateStringname;Animal(Stringname){=name;}publicabstractvoidbarking();}classBirdextendsAnimal{ privateStringfeatherColor; Bird(Stringn,Stringc){ super(n);featherColor=c; }publicvoidbarking(){ System.out.println("鳥叫聲......");}}classDogextendsAnimal{privateStringhairColor;Dog(Stringn,Stringc){super(n);hairColor=c;}publicvoidbarking(){ System.out.println("狗叫聲......");}}classLady{ privateStringname; privateAnimalanimal; Lady(Stringname,Animalanimal){ =name;this.animal=animal; } publicvoidPetBarking(){animal.barking();}}publicclassDemo3_23{ publicstaticvoidmain(Stringargs[]){ Birdbird=newBird("pigeon","white"); Dogdog=newDog("bigYellow","Yellow"); Ladylady1=newLady("lady1",bird); Ladylady2=newLady("lady2",dog); lady1.PetBarking(); lady2.PetBarking();}}程序運行的結(jié)果:抽象類在程序設(shè)計過程中,有時需要創(chuàng)建某個類代表一些基本行為,并為其定義一些方法,但是又無法或不宜在這個類中對這些行為加以具體實現(xiàn),而希望在其子類中根據(jù)實際情況再去實現(xiàn)這些方法。這種思想通過抽象類來實現(xiàn)。用abstract關(guān)鍵字來修飾一個類時,這個類叫做抽象類。其語法格式:abstractclass類名{ //抽象類體}1、一個abstract類并不關(guān)心功能的具體行為,只關(guān)心它的子類是否具有這種功能,并且功能的具體行為由子類負(fù)責(zé)實現(xiàn)。2、抽象類不能被實例化,抽象類必須被繼承,通過子類才能實例化。抽象方法用abstract來修飾一個方法時,該方法叫做抽象方法。抽象方法只需聲明,而不需實現(xiàn)。其語法格式:abstract方法返回值方法名(參數(shù)列表);1、抽象方法因為沒有實現(xiàn)體,所有就沒有兩個花括號{},抽象方法用于抽象類或接口中。2、抽象方法必須被重寫。3、含有抽象方法的類必須被聲明為抽象類。4、在子類中實現(xiàn)抽象類,必須實現(xiàn)所有的抽象方法,如果有抽象方法沒有被實現(xiàn),則該子類也是抽象類?!纠?-24】:通過案例掌握抽象類抽象方法的使用。定義一個抽象類,然后通過繼承實現(xiàn)該抽象類。abstractclassAnimal{privateStringname;Animal(Stringname){=name;}publicabstractvoidenjoy();}classCatextendsAnimal{privateStringeyeColor;Cat(Stringname,StringeyeColor){super(name);this.eyeColor=eyeColor;}publicvoidenjoy(){System.out.println("貓叫聲...");}}publicclassDemo3_24{ publicstaticvoidmain(String[]args){ Catc=newCat("pipi","blue"); c.enjoy(); }}程序運行的結(jié)果:接口繼承性是JAVA語言的一個重要特征,它能夠很好地實現(xiàn)代碼復(fù)用。但是JAVA中的繼承是單繼承,一個子類最多只能有一個直接父類。單繼承使得程序的層次關(guān)系清晰、可讀性強,實際上單繼承使得JAVA中的類的層次結(jié)構(gòu)成為樹型結(jié)構(gòu),這種結(jié)構(gòu)在處理一些復(fù)雜問題時可能表現(xiàn)不出優(yōu)勢。現(xiàn)實世界中多繼承是大量存在的,有的面向?qū)ο笳Z言也支持多繼承(如C++),多繼承有其優(yōu)點,也有其缺陷。為了彌補單繼承的不足,使其在語言中達到多繼承的效果,JAVA提供了接口,利用接口可以間接地實現(xiàn)多繼承接口的概念Java接口是一系列方法的聲明和常量值的集合,接口只有方法的特征沒有方法的實現(xiàn),因此這些方法可以在不同的地方被不同的類實現(xiàn),而這些實現(xiàn)可以具有不同的行為和功能。接口的定義接口中聲明了方法和常量,接口的定義包括接口聲明和接口體兩個部分,采用interf

溫馨提示

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

評論

0/150

提交評論