Java程序設(shè)計(jì)項(xiàng)目式教程 課件 單元4 Java繼承_第1頁(yè)
Java程序設(shè)計(jì)項(xiàng)目式教程 課件 單元4 Java繼承_第2頁(yè)
Java程序設(shè)計(jì)項(xiàng)目式教程 課件 單元4 Java繼承_第3頁(yè)
Java程序設(shè)計(jì)項(xiàng)目式教程 課件 單元4 Java繼承_第4頁(yè)
Java程序設(shè)計(jì)項(xiàng)目式教程 課件 單元4 Java繼承_第5頁(yè)
已閱讀5頁(yè),還剩73頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

§4-1不同類(lèi)別學(xué)生信息的管理Java面向?qū)ο蟪绦蛟O(shè)計(jì)教學(xué)目標(biāo)任務(wù)分析

說(shuō)到學(xué)生大家肯定都不陌生,在每個(gè)人的腦海中定都會(huì)呈現(xiàn)出不同的學(xué)生形象。那么如何對(duì)學(xué)生下一個(gè)定義呢?百度百科中是這樣描述的:“學(xué)生,也叫學(xué)子;一般指正在學(xué)校、學(xué)堂或其他學(xué)習(xí)地方受教育的人,而在研究機(jī)構(gòu)或工作單位(如醫(yī)院、研究所)學(xué)習(xí)的人也稱(chēng)學(xué)生,根據(jù)學(xué)習(xí)的不同階段,可以把學(xué)生分為:幼兒園學(xué)生、小學(xué)生、中學(xué)生、高等院校學(xué)生(大學(xué)生、碩士研究生、博士研究生)等等。”由此可見(jiàn)“在學(xué)校接受學(xué)習(xí)教育”是學(xué)生的共性,小學(xué)生、中學(xué)生、大學(xué)生又各有不同的特點(diǎn)。我們?nèi)绾瓮ㄟ^(guò)Java程序來(lái)描述學(xué)生這一群體呢?

通過(guò)本單元Java繼承相關(guān)知識(shí)的學(xué)習(xí),就可以非常高效地解決此問(wèn)題。教學(xué)內(nèi)容1Java繼承的實(shí)現(xiàn)Java中的繼承23繼承與構(gòu)造方法成員的隱藏與覆蓋45super和final關(guān)鍵字一、Java中的繼承繼承是面向?qū)ο蟪绦蛟O(shè)計(jì)中最為關(guān)鍵的概念及編程技術(shù)。類(lèi)的繼承也稱(chēng)為類(lèi)的派生,一個(gè)新類(lèi)可以從另一個(gè)已存在的類(lèi)中派生,這個(gè)過(guò)程便稱(chēng)為類(lèi)的繼承。派生出的新類(lèi)稱(chēng)為已有類(lèi)的子類(lèi)(Subclass)或派生類(lèi)(Derivedclass),已有類(lèi)稱(chēng)為基類(lèi)(Baseclass)、父類(lèi)(Parentclass)或超類(lèi)(Superclass)。類(lèi)的繼承性很好地解決了軟件的代碼重用性問(wèn)題。通過(guò)繼承,一個(gè)類(lèi)可以擁有已有類(lèi)的功能。即子類(lèi)不但可以繼承父類(lèi)的行為和屬性,它還可以根據(jù)需要增加自己的行為和屬性。Java只支持單重繼承,所以Java程序中的類(lèi)層次結(jié)構(gòu)是樹(shù)狀結(jié)構(gòu)。什么是繼承一、Java中的繼承【例4-1】類(lèi)繼承程序示例。classVehicle{

publicvoidstart(){

System.out.println(“Starting...”);}}classCarextendsVehicle{publicvoiddrive(){

System.out.println(“Driveing...”);}}publicclassTestVehicle{publicstaticvoidmain(string[],args){

System.out.println(“Createingacar...”);Carc=newCar();c.start();c.drive();}}二、Java繼承的實(shí)現(xiàn)Java中的繼承是通過(guò)在類(lèi)聲明中加入extends關(guān)鍵字來(lái)實(shí)現(xiàn)的。其一般格式如下:

[類(lèi)修飾符]class子類(lèi)名extends父類(lèi)名{

//子類(lèi)類(lèi)體

}例如:

classCarextendsVehicle二、Java繼承的實(shí)現(xiàn)1)子類(lèi)可以繼承父類(lèi)中所有非私有的變量成員和方法成員。2)子類(lèi)不能繼承父類(lèi)的構(gòu)造方法,因?yàn)楦割?lèi)構(gòu)造方法創(chuàng)建的是父類(lèi)對(duì)象,子類(lèi)必須聲明自己的構(gòu)造方法,用于創(chuàng)建子類(lèi)自己的對(duì)象。但在子類(lèi)構(gòu)造方法中可以(顯式或隱式地)調(diào)用父類(lèi)的構(gòu)造方法。3)子類(lèi)可以聲明自己的變量成員和方法成員。如果子類(lèi)聲明了與父類(lèi)同名的成員,則不能繼承父類(lèi)的成員,此時(shí)子類(lèi)成員覆蓋(或隱藏)了父類(lèi)的成員。4)子類(lèi)不能刪除父類(lèi)成員。5)子類(lèi)對(duì)象對(duì)父類(lèi)對(duì)象的訪問(wèn)權(quán)限遵循表3-1中的訪問(wèn)權(quán)限規(guī)定。6)extends關(guān)鍵字后即為父類(lèi)的名字。其實(shí)這個(gè)父類(lèi)也可以是另一個(gè)類(lèi)的子類(lèi),所以父類(lèi)、子類(lèi)是相對(duì)的。Java繼承遵循的規(guī)則二、Java繼承的實(shí)現(xiàn)【例4-2】子類(lèi)的創(chuàng)建與實(shí)現(xiàn)示例1。//創(chuàng)建父類(lèi)AclassA{inti,j;voidshowij(){

System.out.println("iandj:"+i+""+j);}}//創(chuàng)建類(lèi)A的子類(lèi)BclassBextendsA{intk;//k是子類(lèi)B加入的成員變量.voidshowk(){System.out.println("k:"+k);}voidsum(){

System.out.println("i+j+k:"+(i+j+k));}}classExample{publicstaticvoidmain(Stringargs[]){AsuperObj=newA();BsubObj=newB();//父類(lèi)的對(duì)象可以使用自己的成員變量.superObj.i=10;superObj.j=20;System.out.println("父類(lèi)可用的成員變量有:");superObj.showij();System.out.println();//子類(lèi)可以引用父類(lèi)的非private成員變量及子類(lèi)自己的成員變量subObj.i=7;subObj.j=8;subObj.k=9;System.out.println("子類(lèi)可用的成員變量有:");subObj.showij();subObj.showk();System.out.println();System.out.println("子類(lèi)中成員變量的和為:");subObj.sum();}}二、Java繼承的實(shí)現(xiàn)【例4-3】子類(lèi)的創(chuàng)建與實(shí)現(xiàn)示例2。//創(chuàng)建父類(lèi)A.classA{inti;//默認(rèn)權(quán)限的成員變量.privateintj;//只限于A使用的局部成員變量.

publicvoidsetij(intx,inty){i=x;j=y;}publicintgetj(){

returnj;

}}//創(chuàng)建類(lèi)A的子類(lèi)B.classBextendsA{inttotal;voidsum(){

total=i+j;

//語(yǔ)法錯(cuò)誤。子類(lèi)B無(wú)權(quán)訪問(wèn)A類(lèi)中的用private成員j.

total=i+getj();//允許}}classAccess{publicstaticvoidmain(Stringargs[]){BsubOb=newB();subOb.setij(10,12);subOb.sum();System.out.println("Totalis"+subOb.total);}}說(shuō)明:1)子類(lèi)只能繼承父類(lèi)中的非私有成員2)Java中每個(gè)類(lèi)都有父類(lèi),如果沒(méi)有顯式地標(biāo)明類(lèi)的父類(lèi),則隱含為java.lang包中的Object類(lèi)。三、成員的隱藏與覆蓋子類(lèi)不僅可以繼承父類(lèi)的所有非私有成員,還可以對(duì)父類(lèi)的屬性變量及方法進(jìn)行重新定義,分別稱(chēng)為變量隱藏和方法覆蓋。若子類(lèi)定義了與父類(lèi)同名的變量成員,則父類(lèi)中同名的變量成員將被隱藏起來(lái)。當(dāng)在子類(lèi)對(duì)象中直接通過(guò)變量名訪問(wèn)變量成員時(shí),訪問(wèn)到的是子類(lèi)的同名變量,如果需要訪問(wèn)同名的父類(lèi)變量,必須通過(guò)父類(lèi)名或super關(guān)鍵字來(lái)訪問(wèn)。1.變量成員的隱藏三、成員的隱藏與覆蓋【例4-4】變量隱藏示例1。//創(chuàng)建父類(lèi)A1classA1{inti=100;}//創(chuàng)建類(lèi)A1的子類(lèi)B1publicclassB1extendsA1{inti=200;//子類(lèi)B1的同名成員變量ivoidprint(){System.out.println("子類(lèi)中i="+i);System.out.println("父類(lèi)中i="+super.i);//訪問(wèn)父類(lèi)A的同名成員變量i}publicstaticvoidmain(Stringargs[]){ (newB1()).print();}}三、成員的隱藏與覆蓋【例4-5】變量隱藏示例2。classA2{intm=5;publicvoidsetM(inti){

m=i;

}voidprinta(){

System.out.println("m="+m);

}}classB2extendsA2{

intm=10;voidprintb(){super.m=super.m+20;System.out.println("super.m="+super.m+"m="+m);}}publicclassTest{publicstaticvoidmain(String[]args){A2a=newA2();a.setM(50);a.printa();B2b=newB2();b.printb();b.printa();b.setM(60);b.printb();b.printa();a.printa();}}三、成員的隱藏與覆蓋子類(lèi)中除可以定義自己的方法之外,也可對(duì)父類(lèi)中的方法進(jìn)行重新定義,這種情況稱(chēng)為方法覆蓋(或重寫(xiě))。當(dāng)調(diào)用一個(gè)對(duì)象的方法時(shí),Java總是先在該對(duì)象所屬的類(lèi)中尋找該方法的定義,如果找不到,就到該類(lèi)的上一級(jí)別的類(lèi)中去尋找,直到找到了該方法的定義。如果需要調(diào)用父類(lèi)中被覆蓋的方法,則使用關(guān)鍵字super。方法覆蓋中需要注意的問(wèn)題是,子類(lèi)重新定義父類(lèi)已有的方法時(shí),應(yīng)保持與父類(lèi)完全相同的方法名、返回值和參數(shù)列表。2.方法覆蓋三、成員的隱藏與覆蓋【例4-6】方法覆蓋示例程序。//創(chuàng)建父類(lèi)A3.classA3{inti;voidsetValue(){

i=100;

}publicvoidchangeValue(){

i=i-50;

}publicvoidprint(){

System.out.println("父類(lèi)中i="+i);}}//創(chuàng)建類(lèi)A的子類(lèi)B3.classB3extendsA3{intk;

//k是子類(lèi)B3加入的成員變量.voidsetValue(){

k=200;

}publicvoidchangeValue(){

k=k+50;

}publicvoidprint(){

super.print();//調(diào)用父為中的print()方法System.out.println("子類(lèi)中k="+k);}}publicclassMethOver{publicstaticvoidmain(Stringargs[]){A3obj1=newA3();B3obj2=newB3();obj1.setValue();obj1.changeValue();obj1.print();obj2.setValue();obj2.changeValue();obj2.print();}}說(shuō)明:如果將子類(lèi)中changeValue()方法和print()方法的類(lèi)修飾符public去年或改為private,程序就不能通過(guò)編譯,因?yàn)镴ava中規(guī)定,子類(lèi)中重定義的方法不能比它所覆蓋的方法具有更嚴(yán)格的訪問(wèn)權(quán)限。特別地,如果父類(lèi)方法是public,那么子類(lèi)方法一定要聲明為public,如果遺漏將發(fā)生編譯錯(cuò)誤。三、成員的隱藏與覆蓋所謂多態(tài)是指不同類(lèi)型的對(duì)象對(duì)同一行為作出的不同反應(yīng),多態(tài)是繼封裝、繼承之后,面向?qū)ο蟪绦蛟O(shè)計(jì)的第三大特性。例如不同階段學(xué)生的學(xué)習(xí),就是同一行為,但學(xué)習(xí)的具體內(nèi)容和具體實(shí)現(xiàn)過(guò)程是不一樣的,現(xiàn)實(shí)中這種的例子還有很多,Java中稱(chēng)其為多態(tài)。即同一行為,不同對(duì)象有不同的實(shí)現(xiàn)方式或狀態(tài)。Java面向?qū)ο蟪绦蛟O(shè)計(jì)中實(shí)現(xiàn)多態(tài)技術(shù)的兩種重要手段是方法重載和方法覆蓋,實(shí)際編程中要注意兩者的區(qū)別。方法覆蓋是對(duì)從父類(lèi)所繼承的方法進(jìn)行重寫(xiě),而且要示要保持與父類(lèi)同名方法完全相同的方法聲明部分(即應(yīng)與父類(lèi)有完全相同的方法名、返回值和參數(shù)列表);方法重載是同一類(lèi)中有多個(gè)同名方法,且要求與被重載的方法必須有不同的參數(shù)列表。3.類(lèi)的多態(tài)及實(shí)現(xiàn)四、繼承與構(gòu)造方法當(dāng)一個(gè)類(lèi)被實(shí)例化時(shí),它的構(gòu)造方法自動(dòng)被調(diào)用。當(dāng)一個(gè)子類(lèi)被實(shí)例化時(shí),即使沒(méi)有加入任何調(diào)用構(gòu)造方法的語(yǔ)句,子類(lèi)的構(gòu)造方法和父類(lèi)的構(gòu)造方法都被自動(dòng)地調(diào)用。classSuperClass{publicSuperClass(){

System.out.println("SuperClassconstructor");

}publicSuperClass(Stringmsg){

System.out.println("SuperClassconstructor:"+msg);

}}【例4-7】隱含調(diào)用父類(lèi)構(gòu)造方法示例。比較程序運(yùn)行結(jié)果,認(rèn)識(shí)構(gòu)造方法的調(diào)用規(guī)則。classSubClassextendsSuperClass{publicSubClass(Stringmsg){System.out.println("SubClassconstructor:"+msg);

}}publicclassTestSuper{publicstaticvoidmain(Stringargs[]){

SubClassdescendent=newSubClass("Test");

}}四、繼承與構(gòu)造方法1)如果在子類(lèi)的構(gòu)造方法中沒(méi)有明確地調(diào)用父類(lèi)的構(gòu)造方法,則系統(tǒng)在創(chuàng)建子類(lèi)時(shí)會(huì)自動(dòng)調(diào)用父類(lèi)的默認(rèn)構(gòu)造方法(即無(wú)參構(gòu)造方法)。2)如果在子類(lèi)的構(gòu)造方法中有明確地調(diào)用父類(lèi)的構(gòu)造方法的語(yǔ)句,則調(diào)用語(yǔ)句必須是子類(lèi)構(gòu)造方法的第一個(gè)語(yǔ)句。構(gòu)造方法調(diào)用規(guī)則五、super和final關(guān)鍵字關(guān)鍵字super可以用于兩種用途:一是調(diào)用父類(lèi)的構(gòu)造方法;二是調(diào)用父類(lèi)中的成員。(1)調(diào)用父類(lèi)的構(gòu)造方法super用于調(diào)用父類(lèi)的構(gòu)造方法,其語(yǔ)法格式為:

super();或super(參數(shù)列表);該語(yǔ)句必須出現(xiàn)在子類(lèi)構(gòu)造方法的第一個(gè)語(yǔ)句。(2)調(diào)用父類(lèi)中的成員當(dāng)在子類(lèi)中定義了與父類(lèi)同名的變量或方法時(shí),父類(lèi)中的同名成員則被隱藏,如果要調(diào)用父類(lèi)中的同名成員,則要加前綴super。其語(yǔ)法格式為:

super.變量名;或super.方法名([參數(shù)列表]);1.super關(guān)鍵字五、super和final關(guān)鍵字Java中關(guān)鍵字final可以用來(lái)修飾類(lèi)、方法或變量。(1)final修飾類(lèi),阻止繼承對(duì)于不允許被繼承的類(lèi),可以使用final修飾符將它們定義為最終類(lèi)。如:

finalclassberd{

publicvoidfly(){

……

}

}

該類(lèi)將不能用來(lái)產(chǎn)生子類(lèi),否則將產(chǎn)生編譯錯(cuò)誤。2.final關(guān)鍵字五、super和final關(guān)鍵字(2)final修飾方法,阻止該方法被覆蓋如果一個(gè)方法不希望被覆蓋,則可使用fina將其說(shuō)明為最終方法。如:

classanimal{

finalvoidbreath(){

……

}

}該方法將不能被覆蓋,否則同樣會(huì)產(chǎn)生編譯錯(cuò)誤。(3)final修飾屬性,用于聲明常量final另一個(gè)作用是用來(lái)說(shuō)明常量。如:

finalintA=10;則A將被定義為常量,其值將不能再被改變。2.final關(guān)鍵字任務(wù)實(shí)施編程分別描述小學(xué)生、中學(xué)生、大學(xué)生的屬性和學(xué)習(xí)特點(diǎn)。1)任務(wù)分析。無(wú)論是小學(xué)生、中學(xué)生、大學(xué)生均為學(xué)生,所有他們都具有學(xué)生的屬性和行為。如:都需要有學(xué)號(hào)、姓名、性別、年齡等基本的屬性,都必須有完成學(xué)習(xí)的行為;但又因?yàn)樗麄兲幱诓煌某砷L(zhǎng)、學(xué)習(xí)階段,各自又有一些獨(dú)特屬性,如大學(xué)生要有所學(xué)專(zhuān)業(yè)方面的屬性,不同學(xué)生完成學(xué)習(xí)這一行為所使用學(xué)習(xí)方法也各不同。2)任務(wù)實(shí)施。三類(lèi)學(xué)生既有共同屬性和行為,也有各自特別的屬性和行為方式,為了提高編程效率,可以使用Java繼承來(lái)實(shí)現(xiàn)。首先定義父類(lèi)Student,然后分別定義代表小學(xué)生、中學(xué)生和大學(xué)生的子類(lèi):SStudent、MStudent、GStudent,還要有一個(gè)提供程序執(zhí)行入口的主類(lèi):TestStudent。完成“工單4-1”訓(xùn)練任務(wù)同步訓(xùn)練課后作業(yè)P83課后作業(yè),三、1

§4-2使用抽象類(lèi)實(shí)現(xiàn)學(xué)生類(lèi)繼承Java面向?qū)ο蟪绦蛟O(shè)計(jì)教學(xué)目標(biāo)任務(wù)分析

在上一任務(wù)的實(shí)施中,父類(lèi)定義的表示“信息顯示”和“學(xué)習(xí)行為”的兩個(gè)方法,并不完全適合各個(gè)子類(lèi),每個(gè)子類(lèi)都需要對(duì)這兩個(gè)方法進(jìn)行重寫(xiě),所以父類(lèi)中對(duì)這兩個(gè)方法的定義是不確定的。對(duì)于這種類(lèi)似情況,Java提供了抽象方法來(lái)滿足這種編程需求。教學(xué)內(nèi)容1抽象類(lèi)抽象方法2一、抽象方法Java中用關(guān)鍵字abstract聲明抽象方法,抽象方法聲明的一般格式為:

abstract類(lèi)型方法名([參數(shù)列表]);如:

publicabstractvoidcomputeArea();

publicabstractvoidcomputePerimeter();抽象方法只有方法的說(shuō)明部分,方法體被一個(gè)分號(hào)(;)代替,方法的具體實(shí)現(xiàn)由各個(gè)子類(lèi)完成。所有的抽象方法必須存在于抽象類(lèi)中。二、抽象類(lèi)抽象類(lèi)是不能使用new關(guān)鍵字進(jìn)行實(shí)例化的類(lèi),即沒(méi)有具體實(shí)例對(duì)象的類(lèi)。抽象類(lèi)同樣使用abstract關(guān)鍵字進(jìn)行修飾。抽象類(lèi)聲明的一般格式為:

[public]abstractclass類(lèi)名{

類(lèi)體

}抽象類(lèi)中可以包含常規(guī)類(lèi)中能夠包含的所有成員。如可將Student類(lèi)定義為如下抽象類(lèi)。

abstractclassStudent{

Stringsid; //學(xué)號(hào)

Stringsname; //姓名

intsage; //年齡

publicabstractvoidshowInfo(); //抽象方法

publicabstractvoidtoLearn(); //抽象方法

}二、抽象類(lèi)1)包含抽象方法的類(lèi)必須是抽象類(lèi)。2)抽象類(lèi)和抽象方法必須用abstract關(guān)鍵字聲明。3)抽象方法只需聲明不需要實(shí)現(xiàn)。4)子類(lèi)必須實(shí)現(xiàn)父類(lèi)中所有的抽象方法。5)不能用抽象類(lèi)創(chuàng)建對(duì)象。抽象類(lèi)使用說(shuō)明二、抽象類(lèi)【例4-8】抽象類(lèi)和抽象方法的使用示例。abstractclassA4{

//定義一個(gè)抽象類(lèi)abstractStringgetdata();//定義一個(gè)抽象方法publicvoidprint(){System.out.print(getdata());}}classB4extendsA4{Stringgetdata(){//重寫(xiě)抽象方法return“Hellostudents!”;}}publicclassExp{publicstaticvoidmain(String[]args){B4b1=newB4();b1.print();}}任務(wù)實(shí)施使用抽象方法完成完成“任務(wù)4.1”,可將父類(lèi)Student定義為抽象類(lèi)。完成“工單4-2”訓(xùn)練任務(wù)同步訓(xùn)練課后作業(yè)P83課后作業(yè),一、13

三、2

§4-3使用接口實(shí)現(xiàn)學(xué)生信息管理系統(tǒng)Java面向?qū)ο蟪绦蛟O(shè)計(jì)教學(xué)目標(biāo)任務(wù)分析

在學(xué)生信息管理系統(tǒng)中,除定義表示學(xué)生實(shí)體的類(lèi)(實(shí)體類(lèi))之外,還需要定義各種完成系統(tǒng)功能的類(lèi)(業(yè)務(wù)處理類(lèi)),本任務(wù)的業(yè)務(wù)處理類(lèi)中必須完成學(xué)生信息的增、刪、改、查等基本操作,但不同實(shí)體實(shí)現(xiàn)業(yè)務(wù)的方式又各不相同,為了保證這些基本功能的實(shí)現(xiàn),通常先定義一組約束或規(guī)范,約定好必須要實(shí)現(xiàn)的功能,Java中的接口便可以實(shí)現(xiàn)這一功能。教學(xué)內(nèi)容1抽實(shí)現(xiàn)接口定義21Java多態(tài)一、接口定義接口是由一些抽象方法和常量所組成的一個(gè)集合。它的定義與抽象類(lèi)類(lèi)似,只定義了類(lèi)中方法的原型,而沒(méi)有直接定義方法的內(nèi)容。其定義格式為:

[public]interface接口名[extends接口1,接口2,......]{

類(lèi)型標(biāo)識(shí)符常量名1=常數(shù);

類(lèi)型標(biāo)識(shí)符常量名2=常數(shù);

......

類(lèi)型標(biāo)識(shí)符常量名n=常數(shù);

返回值類(lèi)型方法1(參數(shù)列表);

返回值類(lèi)型方法2(參數(shù)列表);

......

返回值類(lèi)型方法n(參數(shù)列表);

}一、接口定義接口中定義的常量默認(rèn)使用了“publicstaticfinal”進(jìn)行修飾,即為靜態(tài)常量;方法都默認(rèn)使用了“publicabstract”進(jìn)行修飾,即為抽象方法。接口也不能用來(lái)實(shí)例化對(duì)象,它不是一個(gè)類(lèi)。例如:

interfaceCallback{

floatPI=3.14159;

voidcallback(floatparam);

}二、接口實(shí)現(xiàn)一個(gè)或多個(gè)類(lèi)可以實(shí)現(xiàn)該接口。Java中使用關(guān)鍵字implements實(shí)現(xiàn)接口,接口實(shí)現(xiàn)一般格式如下:

[public]class類(lèi)名[extends父類(lèi)名稱(chēng)][implements接口名列表]

{類(lèi)體

}說(shuō)明:1)如果一個(gè)類(lèi)實(shí)現(xiàn)多個(gè)接口,這些接口名之間用逗號(hào)分隔。2)當(dāng)一個(gè)類(lèi)實(shí)現(xiàn)某個(gè)接口時(shí),必須實(shí)現(xiàn)接口中的所有方法,且方法必須聲明為public;如果不能實(shí)現(xiàn),也必須寫(xiě)出一個(gè)空方法。而且,實(shí)現(xiàn)方法的類(lèi)型必須嚴(yán)格與接口定義中指定的類(lèi)型相匹配。3)允許多個(gè)類(lèi)實(shí)現(xiàn)同一接口。二、接口實(shí)現(xiàn)例如,實(shí)現(xiàn)Callback接口的類(lèi)Area的定義。

classAreaimplementsCallback{

publicvoidcallback(floatr){

System.out.println("半徑為"+r+"圓的面積是:"+PI*r*r);

}

}注意:callback(

)必須用public修飾符聲明。二、接口實(shí)現(xiàn)【例4-9】根據(jù)用戶要求在控制臺(tái)打印不同的圖形。interfaceShape{//定義接口voiddraw();}classCircleimplementsShape{voiddraw(){System.out.println("drawCircle.");}}classSquareimplementsShape{voiddraw(){System.out.println("drawSquare.");}}classTriangleimplementsShape{voiddraw(){System.out.println("drawTriangle.");}}classTestShape{publicstaticvoidmain(String[]args){drawShape(newCircle());

drawShape(newSquare());

drawShape(newTriangle());

}staticvoiddrawShape(Shapes){//s可以是實(shí)現(xiàn)Shape接口的任何類(lèi)的對(duì)象

s.draw();

}}三、Java多態(tài)性封裝是把客觀事物封裝成抽象的類(lèi),并且類(lèi)可以把自己的數(shù)據(jù)和方法只讓可信的類(lèi)或者對(duì)象操作,對(duì)不可信的進(jìn)行信息隱藏。類(lèi)中成員的屬性有:public,protected,(default),private,這四個(gè)屬性的訪問(wèn)權(quán)限依次降低。

封裝可以隱藏實(shí)現(xiàn)細(xì)節(jié),實(shí)現(xiàn)了代碼模塊化。繼承是指這樣一種能力,它可以使用現(xiàn)有類(lèi)的所有功能,并在無(wú)需重新編寫(xiě)原來(lái)類(lèi)的情況下對(duì)這些功能進(jìn)行擴(kuò)展。

繼承實(shí)現(xiàn)了代碼重用,提高了代碼編寫(xiě)效率。封裝、繼承、多態(tài)是Java面向?qū)ο缶幊痰娜筇卣?,也稱(chēng)為三大基石。三、Java多態(tài)性多態(tài)是指不同對(duì)象在調(diào)用同一個(gè)方法時(shí),表現(xiàn)出的多種不同形態(tài)。利用多態(tài)可以使程序具有良好的可維護(hù)性和可擴(kuò)展性。Java中的多態(tài)有兩種。

1)編譯時(shí)多態(tài):方法的重載。

2)運(yùn)行時(shí)多態(tài):Java運(yùn)行時(shí)系統(tǒng)根據(jù)調(diào)用該方法的對(duì)象類(lèi)型來(lái)決定選擇調(diào)用哪個(gè)方法。多態(tài)實(shí)現(xiàn)有三個(gè)必要條件。一要有繼承,二要有重寫(xiě),三是父類(lèi)引用指向子類(lèi)對(duì)象封裝、繼承、多態(tài)是Java面向?qū)ο缶幊痰娜筇卣鳎卜Q(chēng)為三大基石。三、Java多態(tài)性【例4-10】多態(tài)性應(yīng)用示例,對(duì)各類(lèi)水果味道的描述。publicabstractclassFruit{ //抽象類(lèi),父類(lèi)——水果

Stringfname;

publicFruit(Stringfname){ super(); this.fname=fname;

}

publicabstractvoidshowTaste();//抽象方法,描述水果味道}publicclassOrangeextendsFruit{ //子類(lèi)——橙子類(lèi)

publicOrange(Stringfname){ super(fname);

}

publicvoidshowTaste(){ System.out.println("酸甜可口!");

}}publicclassAppleextendsFruit{ //子類(lèi)——蘋(píng)果類(lèi)

publicApple(Stringfname){ super(fname);

}

publicvoidshowTaste(){ System.out.println("非常甜!");

}}publicclassChild{ //孩子類(lèi)

Stringname;

publicChild(Stringname){ super(); =name;

}

publicvoideat(Fruitfruit){ //父類(lèi)對(duì)象作為形參

//參數(shù)是父類(lèi)型“水果”類(lèi)型,該父類(lèi)及其子類(lèi)的對(duì)象都可以作為實(shí)參傳入 System.out.print(+"今天吃了一個(gè)"+fruit.fname+","); fruit.showTaste();

}}三、Java多態(tài)性【例4-10】多態(tài)性應(yīng)用示例,對(duì)各類(lèi)水果味道的描述。publicclassTestFruit{ //主類(lèi)(測(cè)試類(lèi))

publicstaticvoidmain(String[]args){ Childchild1=newChild("小明"); Childchild2=newChild("小紅"); child1.eat(newApple("蘋(píng)果")); //子類(lèi)對(duì)象作為實(shí)參 child2.eat(newOrange("橙子"));

//子類(lèi)對(duì)象作為實(shí)參

//實(shí)現(xiàn)動(dòng)態(tài)綁定,在執(zhí)行期間判斷所引用對(duì)象的實(shí)際類(lèi)型,根據(jù)其實(shí)際的類(lèi)型調(diào)用其相應(yīng)的方法

}}程序說(shuō)明:1)程序中使用了一個(gè)實(shí)現(xiàn)多態(tài)的關(guān)鍵手段:“將子類(lèi)的引用賦給父類(lèi)對(duì)象(向上轉(zhuǎn)型)”也稱(chēng)為“父類(lèi)引用指向子類(lèi)對(duì)象”。相當(dāng)于:Fruitapple=newApple();聲明的是父類(lèi)類(lèi)型,創(chuàng)建的是子類(lèi)對(duì)象。2)該程序具有較強(qiáng)的可擴(kuò)展性。如:若在程序中再增加一種水果——桃子,現(xiàn)在已有代碼不需要做任何改動(dòng),只需要添加一個(gè)“桃子”子類(lèi),就可以完成。這就是多態(tài)的最大優(yōu)勢(shì)。任務(wù)實(shí)施學(xué)生信息管理系統(tǒng)中,為了實(shí)現(xiàn)學(xué)生信息的“增、刪、改、查”這些基本功能,首先定義了一個(gè)接口StudentDao,在其中規(guī)定了實(shí)現(xiàn)接口的類(lèi)必須實(shí)現(xiàn)的功能。publicinterfaceStudentDao{

publicUserlogin(Stringuname,Stringupassword); publicintaddStudent(Studentstudent); publicintupdateStudent(Studentstudent); publicintdelStudentbyID(intsid);}完成“工單4-3”訓(xùn)練任務(wù)同步訓(xùn)練課后作業(yè)P83課后作業(yè),一、2

三、

§4-4使用包對(duì)項(xiàng)目進(jìn)行管理Java面向?qū)ο蟪绦蛟O(shè)計(jì)教學(xué)目標(biāo)任務(wù)分析

在學(xué)生信息管理系統(tǒng)中,為了實(shí)現(xiàn)系統(tǒng)規(guī)定的功能,分別設(shè)計(jì)了實(shí)體類(lèi)、業(yè)務(wù)類(lèi)、工具類(lèi)、界面實(shí)現(xiàn)類(lèi)、接口等多種不同功能的類(lèi),為了對(duì)這些類(lèi)進(jìn)行分門(mén)別類(lèi)的管理,需要用到“包”這一工具。教學(xué)內(nèi)容1導(dǎo)入其他包中的類(lèi)包的定義21常用系統(tǒng)包及類(lèi)一、包的定義包(package)是類(lèi)的一種組織方式。在操作系統(tǒng)中,用文件夾(目錄)來(lái)組織管理文件,Java則利用包來(lái)組織相關(guān)的類(lèi)及各種相關(guān)文件,并控制其訪問(wèn)權(quán)限,同一包中的類(lèi)默認(rèn)情況下可以互相訪問(wèn)。如同文件夾一樣,包也采用了樹(shù)形目錄的存儲(chǔ)方式,同一個(gè)包中的類(lèi)名字不能相同,不同包中類(lèi)的名字則可以相同,當(dāng)同時(shí)調(diào)用兩個(gè)不同包中相同類(lèi)名的類(lèi)時(shí),應(yīng)該加上包名加以區(qū)別。Java中的包可以分為兩種形式:內(nèi)置包(系統(tǒng)包)和用戶自定義包。一、包的定義包的定義是指用戶自定義包。Java使用package關(guān)鍵字定義包,package語(yǔ)句應(yīng)該放在源文件的第一行,在每個(gè)源文件中只能有一個(gè)包定義語(yǔ)句。定義包的語(yǔ)法格式如下:

package包名;Java包的命名規(guī)則。1)包名一般全部由小寫(xiě)字母(多個(gè)單詞也全部小寫(xiě))組成。2)如果包名包含多個(gè)層次,每個(gè)層次用“.”分割。3)包名一般由倒置的域名開(kāi)頭,比如com.baidu,不要有www。4)用戶自定義包不能用java開(kāi)頭。二、導(dǎo)入其他包中的類(lèi)如果使用不同包中的類(lèi),需要使用該類(lèi)的全名(包名+類(lèi)名)。如:

unit.Testtest=newunit.Test();其中,unit是包名,Test是包中的類(lèi)名,test是類(lèi)的對(duì)象。為了簡(jiǎn)化編程,可以使用import可以向某個(gè)Java文件中導(dǎo)入指定包層次下的某個(gè)類(lèi)或全部類(lèi)。一個(gè)Java源文件只能包含一個(gè)package語(yǔ)句,但可以包含多個(gè)import語(yǔ)句。import導(dǎo)入單個(gè)類(lèi)的語(yǔ)法格式:

import包名+類(lèi)名;如,importunit.Test;import導(dǎo)入指定包下全部類(lèi)的語(yǔ)法格式:

import包名.*;import語(yǔ)句中的星號(hào)(*)只能代表類(lèi),不能代表包,只能導(dǎo)入指定包下的所有類(lèi)。二、導(dǎo)入其他包中的類(lèi)【例4-11】包應(yīng)用實(shí)例。將Calculate接口和Sum類(lèi)存儲(chǔ)在ch04包中,然后在ch05包中調(diào)用這些類(lèi)。packagech04;//創(chuàng)建包c(diǎn)h04interfaceCalculate{

intdisp(intn);}publicclassSumimplementsCalculate{publicintdisp(intn){ints=0,i;for(i=1;i<=n;i++)s=s+i;returns;}}//ch05包中的Test類(lèi)packagech05;importch04.*;publicclassTest{publicstaticvoidmain(Stringargs[]){intn=10;Sums=newSum();System.out.println("1—"+n+"的和為:"+s.disp(n));}}三、常用系統(tǒng)包及類(lèi)Java提供了豐富類(lèi)庫(kù),為用戶提供了豐富的應(yīng)用程序接口(ApplicationProgrammingInterface,API),也是Java重要的特三、常用系統(tǒng)包及類(lèi)色之一。這些類(lèi)庫(kù)分別放在不同的Java系統(tǒng)包中。Java常用包及功能如表4-1所示。包名所提供類(lèi)的主要功能java.langJava的核心類(lèi)庫(kù),包含運(yùn)行Java程序必不可少的系統(tǒng)類(lèi),如基本數(shù)據(jù)類(lèi)型、基本數(shù)學(xué)函數(shù)、字符串處理、異常處理和線程類(lèi)等。系統(tǒng)默認(rèn)加載這個(gè)包java.ioJava語(yǔ)言的標(biāo)準(zhǔn)輸入/輸出類(lèi)庫(kù),如基本輸入/輸出流、文件輸入/輸出、過(guò)濾輸入/輸出流等java.util包含如處理時(shí)間的Date類(lèi),處理動(dòng)態(tài)數(shù)組的Vector類(lèi),以及Stack和HashTable類(lèi)java.awt構(gòu)建圖形用戶界面(GUI)的類(lèi)庫(kù),低級(jí)繪圖操作Graphics類(lèi)、圖形界面組件和布局管理(如Checkbox類(lèi)、Container類(lèi)、LayoutManager接口等),以及用戶界面交互控制和事件響應(yīng)(如Event類(lèi))Java.swing構(gòu)建圖形用戶界面組件類(lèi)庫(kù)java.math提供有關(guān)數(shù)學(xué)計(jì)算的類(lèi)及其方法實(shí)現(xiàn)網(wǎng)絡(luò)功能的類(lèi)庫(kù)有Socket類(lèi)、ServerSocket類(lèi)java.sql實(shí)現(xiàn)JDBC的類(lèi)庫(kù)java.text提供有關(guān)操作數(shù)據(jù)、文本、數(shù)字和消息的類(lèi)及其方法三、常用系統(tǒng)包及類(lèi)使用基本數(shù)據(jù)類(lèi)型聲明的變量不被視為對(duì)象,Java語(yǔ)言中專(zhuān)門(mén)提供了與基本數(shù)據(jù)類(lèi)型相對(duì)應(yīng)的類(lèi),稱(chēng)為包裝類(lèi)(或數(shù)據(jù)類(lèi)型類(lèi)),以便將基本數(shù)據(jù)類(lèi)型當(dāng)作對(duì)象使用。java.lang包對(duì)每個(gè)基本數(shù)據(jù)類(lèi)型都有一個(gè)相應(yīng)的包裝類(lèi),它的名字與基本數(shù)據(jù)類(lèi)型的名字相似,不同的是包裝類(lèi)是一個(gè)類(lèi),它提供構(gòu)造方法、常量和處理不同類(lèi)型的轉(zhuǎn)換方法。表4-2給出了各個(gè)基本數(shù)據(jù)類(lèi)型所對(duì)應(yīng)的包裝類(lèi)的名稱(chēng)。1.包裝類(lèi)4-2包裝類(lèi)包裝類(lèi)(數(shù)據(jù)類(lèi)型類(lèi))基本數(shù)據(jù)類(lèi)型BooleanbooleanCharactercharDoubledoubleFloatfloatIntegerintLonglong三、常用系統(tǒng)包及類(lèi)【例4-12】輸出int類(lèi)型的最大值與最小值和double類(lèi)型絕對(duì)值的最大值與最小值。classMax_Min{

publicstaticvoidmain(Stringargs[]){

System.out.println(Integer.MAX_VALUE);//int類(lèi)型的最大值

System.out.println(Integer.MIN_VALUE);//int類(lèi)型的最小值

System.out.println(Double.MAX_VALUE);//double類(lèi)型絕對(duì)值的最大值

System.out.println(Double.MIN_VALUE);//double類(lèi)型絕對(duì)值的最小值}}三、常用系統(tǒng)包及類(lèi)【例4-13】數(shù)據(jù)類(lèi)型類(lèi)Integer類(lèi)常用方法的使用。publicclassTyprc{ publicstaticvoidmain(Stringargs[]) {

inta=69; System.out.println(a+"的二進(jìn)制是:"+Integer.toBinaryString(a)); //將十進(jìn)制數(shù)轉(zhuǎn)換為二進(jìn)制數(shù) System.out.println(a+"的八進(jìn)制是:"+Integer.toOctalString(a)); //將十進(jìn)制數(shù)轉(zhuǎn)換為八進(jìn)制數(shù) System.out.println(a+"的十六進(jìn)制是:"+Integer.toHexString(a)); //將十進(jìn)制數(shù)轉(zhuǎn)換為十六進(jìn)制數(shù) Integerbj=Integer.valueOf("123"); Integerbj1=newInteger(234);//創(chuàng)建整型對(duì)象 Integerbj2=newInteger("234"); inti=Value();//將對(duì)象轉(zhuǎn)換為整型值 System.out.println("bj="+bj); System.out.println("i="+i); System.out.println("bj1==bj2?"+bj1.equals(bj2)); }}三、常用系統(tǒng)包及類(lèi)Java.lang包中的Math類(lèi)提供了一些常量、基本的數(shù)學(xué)運(yùn)算和幾何運(yùn)算方法,如求平方根、指數(shù)函數(shù)、對(duì)數(shù)函數(shù)、三角函數(shù)等。此類(lèi)中的方法都是靜態(tài)的。并且Math類(lèi)是一個(gè)final類(lèi)。常用的Math類(lèi)中的方法如表4-3所示。2.Math類(lèi)表4-3Math常量、方法常量/方法說(shuō)明doubleE常量e(2.71828)doublePI常量π(3.14159)staticdoublesin(doublenumvalue)計(jì)算角numvalue的正弦值staticdoublecos(doublenumvalue)計(jì)算角numvalue的余弦值staticdoublepow(doublea,doubleb)計(jì)算a的b次方staticdoublesqrt(doublenumvalue)計(jì)算給定值的平方根staticdoubleexp(double計(jì)算e的a次方staticdoublelog(double計(jì)算a的自然對(duì)數(shù)staticintabs(intnumvalue)計(jì)算int類(lèi)型值numvalue的絕對(duì)值,也接收l(shuí)ong、float和double類(lèi)型的參數(shù)staticdoubleceil(doublenumvalue)返回大于等于numvalue的最小整數(shù)值staticdoublefloor(doublenumvalue)返回小于等于numvalue的最大整數(shù)值staticintmax(inta,intb)返回int型值a和b中的較大值,也接收l(shuí)ong、float和double類(lèi)型的參數(shù)staticintmin(inta,intb)返回a和b中的較小值,也可接收l(shuí)ong、float和double類(lèi)型的參數(shù)staticintround(floatnumvalue)返回指定數(shù)字的取整值(四舍五入),也可接收l(shuí)ong類(lèi)型的參數(shù)staticdoublerandom()產(chǎn)生0~1之間的隨機(jī)數(shù)三、常用系統(tǒng)包及類(lèi)【例4-14】Math方法使用示例。classMFUN{

publicstaticvoidmain(Stringargs[]){

floata=3,b=4;

System.out.println("exp(a)="+Math.exp(a));

System.out.println("log(a)="+Math.log(a));

System.out.println("sqr(a)="+Math.sqrt(a));

System.out.println("abs(-a*b)="+Math.abs(-a*b));

System.out.println("3*3*3*3="+Math.pow(a,b));

System.out.println("max(a,b)="+Math.max(a,b));//取a,b的較大值}}三、常用系統(tǒng)包及類(lèi)Date類(lèi)由java.util包提供,表示日期和時(shí)間,提供操縱日期和時(shí)間各組成部分的方法。Date類(lèi)的最佳應(yīng)用之一是獲取系統(tǒng)當(dāng)前時(shí)。Date類(lèi)的常用方法如表4-4所示。3.Date類(lèi)表4-4Date類(lèi)的常用方法方法說(shuō)明publicDate()使用當(dāng)前日期創(chuàng)建對(duì)象;publicDate(longdate)使用自1970年1月1日開(kāi)始到某時(shí)刻的毫秒數(shù)創(chuàng)建對(duì)象booleanafter(Datedate)如果日期在指定日期之后,返回truebooleanbefore(Datedate)如果日期在指定日期之前,返回truebooleanequals(Datedate)如果兩個(gè)日期相等,返回truelonggetTime()返回一個(gè)表示時(shí)間的長(zhǎng)整型(毫秒)voidsetTime(longtime)設(shè)定日期對(duì)象StringtoString()返回日期格式的字符串三、常用系統(tǒng)包及類(lèi)【例4-15】Date類(lèi)使用示例。importjava.util.Date;classDateTimeDisply{

DateobjDate;

DateTimeDisply(){

objDate=newDate();

}

voiddisplay(){StringstrDate,strTime="";System.out.println("今天的日期是:"+objDate);longtime=objDate.getTime();System.out.println("自1970年1月1日起"+“以毫秒為單位的時(shí)間(GMT):"+time);strDate=objDate.toString();strTime=strDate.substring(11,(strDate.length()-4));strTime="時(shí)間:"+strTime.substring(0,8);System.out.println(strTime);}}classDataTest{publicstaticvoidmain(String[]args){

DateTimeDisplyobjDateTime=newDateTimeDisply();

objDateTime.display();}}三、常用系統(tǒng)包及類(lèi)在java.util包中還提供了一個(gè)與日歷相關(guān)的類(lèi)Calendar,它可以根據(jù)給定的Date對(duì)象以YEAR和MONTH等整型的形式檢索信息。Calendar類(lèi)是抽象類(lèi),因此不能像Date類(lèi)那樣實(shí)例化。GregorianCalendar:是Calendar的子類(lèi),可以實(shí)現(xiàn)Gregorian形式的日歷。Calendar的常用方法如表4-5所示。4.Calendar類(lèi)表4-5Calendar類(lèi)的常用方法方法說(shuō)明voidadd(intoriginalvalue,intvalue)將originalvalue指定的時(shí)間或日期增加一個(gè)value值intget(intcalFields)返回調(diào)用對(duì)象calFields指定部分的值。如年、月、日等CalendargetInstance()返回默認(rèn)地區(qū)和時(shí)間的Calendar對(duì)象DategetTime()返回與調(diào)用對(duì)象具有相同時(shí)間的Date對(duì)象voidset(intcalFields,intval)將val中指定的值設(shè)置為調(diào)用對(duì)象calFields所指定的時(shí)間或日期的值voidclear()清除當(dāng)前Calendar對(duì)象中的時(shí)間組成部分部分boolenequals(Objectc)如果當(dāng)前日歷對(duì)象表示的Calendar實(shí)例與對(duì)象c相同,返回true三、常用系統(tǒng)包及類(lèi)【例4-16】Calendar類(lèi)使用示例。importjava.util.Date;importjava.util.Calendar;classCa

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 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ì)用戶上傳內(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)論