面向?qū)ο蟪绦蛟O(shè)計第11講 包和接口(一)_第1頁
面向?qū)ο蟪绦蛟O(shè)計第11講 包和接口(一)_第2頁
面向?qū)ο蟪绦蛟O(shè)計第11講 包和接口(一)_第3頁
面向?qū)ο蟪绦蛟O(shè)計第11講 包和接口(一)_第4頁
面向?qū)ο蟪绦蛟O(shè)計第11講 包和接口(一)_第5頁
已閱讀5頁,還剩25頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第11講包和接口(一)多態(tài)的兩個實例包的定義接口的定義/教學(xué)目標(biāo)掌握合理使用多態(tài)來設(shè)計簡化程序掌握包的概念掌握包的定義和包的引用理解接口的定義和接口的實現(xiàn)方法實例

一:重載的使用編寫一個類,它的功能是計算兩個數(shù)的和。

要求:編寫多個求和方法,實現(xiàn)方法的重載。程序?qū)⒏鶕?jù)參數(shù)的類型自動匹配計算和。classExample_Overloading_Add{

int

add(int

a,intb){

return(a+b); }doubleadd(doublex,doubley){

return(x+y); }doubleadd(doublex,doubley,doublez){ return(x+y+z); }}定義了3個add()方法,實現(xiàn)了方法的重載publicclassEx6_13{publicstaticvoidmain(Stringargs[]){

Example_Overloading_Addadd=newExample_Overloading_Add();

System.out.println("調(diào)用兩個整型加法的重載方法");

System.out.println("結(jié)果是:"+add.add(3,100));

System.out.println("調(diào)用三個雙精度型加法的重載方法");

System.out.println("結(jié)果是:"+add.add(1.0,23.987,39.369));

System.out.println("調(diào)用兩個雙精度型加法的重載方法");

System.out.println("結(jié)果是:"+add.add(59.12,79.123));}}運行結(jié)果:調(diào)用兩個整型加法的重載方法結(jié)果是:103調(diào)用三個雙精度型加法的重載方法結(jié)果是:64.356調(diào)用兩個雙精度型加法的重載方法結(jié)果是:138.243實例

一:重載的使用(續(xù))

實例二:多態(tài)的設(shè)計

一個小孩得知鄰居家養(yǎng)了個寵物,但不知是貓是狗還是鴨子。于是丟一塊石頭到鄰居家院中探明真相。Animal是一個相對抽象的類。在現(xiàn)實世界中,每個動物都一定屬于某個特定的種類,因此,這個類中的sound()成員方法的方法體為空,即本身沒有任何特定的操作,只是為了實現(xiàn)多態(tài)性而設(shè)置。在Dog、Cat和Duck中,覆蓋了Animal類中的這個方法,它們根據(jù)具體動物的特點發(fā)出不同的叫聲。小孩丟石頭,相當(dāng)于發(fā)出命令調(diào)用了寵物類對象的sound()方法。因為小孩并不知道是狗是貓還是鴨子,只知道是寵物。然而實際接收此消息的卻是寵物的派生類對象,如果是狗,則輸出“WoofWoof”字符串;如果是貓,則輸出“Miiaooww”字符串;如果是鴨子,則輸出“Quackquackquack”字符串。importjava.util.Random;classAnimal{//動物類

protectedStringtype;//種類

protectedStringname;//名稱

protectedStringbreed;//品種

publicAnimal(Stringtype,Stringname,Stringbreed){

this.type=newString(type);

=newString(name);

this.breed=newString(breed); }publicStringtoString(){ return"Thisisa"+type+"\nIt's"+name+"the"+breed;}publicvoidsound() {} }類Animal的sound()方法體為空實例二:多態(tài)的設(shè)計(續(xù))classDogextendsAnimal{//Dog類

publicDog(Stringname){super("Dog",name,"Unknow");}publicDog(Stringname,Stringbreed){super("Dog",name,breed);}publicvoidsound(){System.out.println("WoofWoof");}}classCatextendsAnimal{//Cat類

publicCat(Stringname){super("Cat",name,"Unknow");}publicCat(Stringname,Stringbreed){super("Cat",name,breed);}publicvoidsound(){System.out.println("Miiaooww");}}classDuckextendsAnimal{//Duck類

publicDuck(Stringname){super("Duck",name,"Unknow");}publicDuck(Stringname,Stringbreed){super("Duck",name,breed);}publicvoidsound(){System.out.println("Quack

quackquack");}}通過Animal類派生得到的Dog、Cat、Duck類都重新定義了sound()方法,覆蓋了父類的sound()方法實例二:多態(tài)的設(shè)計(續(xù))publicclassEx6_14{//測試類

publicstaticvoidmain(String[]args){Animal[]theAnimals={//創(chuàng)建對象數(shù)組

newDog("Rover","Poodle"),newCat("Max","Abyssinian"),newDuck("Daffy","Aylesbury")};AnimalpetChoice;//聲明父類的引用

Randomselect=newRandom();//創(chuàng)建隨機數(shù)對象

for(inti=0;i<5;i++){

petChoice=theAnimals[select.nextInt(theAnimals.length)];

System.out.println("\nYourChoice:\n"+petChoice);

petChoice.sound();}}}不同的Animals對象自動匹配相應(yīng)的sound()方法。運行結(jié)果:YourChoice:ThisisaDogIt'sRoverthePoodleWoofWoof實例二:多態(tài)的設(shè)計(續(xù))變量的隱藏和方法的覆蓋子類重新定義一個與從父類繼承來的域變量完全相同的變量,稱為變量的隱藏。這里所謂隱藏是指子類擁有兩個同名的變量:當(dāng)子類執(zhí)行繼承自父類的方法時,處理的是繼承來的變量;當(dāng)子類執(zhí)行自定義的方法時,操作的是自定義的變量,而把繼承自父類的變量隱藏了起來。方法覆蓋(Override)即指在子類中重新定義父類中已有的方法。(重寫)子類通過成員變量的隱藏和方法的覆蓋可以把父類的狀態(tài)和行為改變?yōu)樽陨淼臓顟B(tài)和行為。方法覆蓋時應(yīng)遵循的原則覆蓋后的方法不能比被覆蓋的方法有更嚴(yán)格的訪問權(quán)限。覆蓋后的方法不能比被覆蓋的方法產(chǎn)生更多的異常。我們經(jīng)常說”老虎是哺乳動物”,”狗是哺乳動物”等。若哺乳類是老虎類的父類,這樣說當(dāng)然正確,但當(dāng)你說老虎是哺乳動物時,老虎將失掉老虎獨有的屬性和功能。那么,繼承關(guān)系可以扼要的表示為:“新class是舊class的一種形式?!崩杭僭O(shè)A類是B類的父類,當(dāng)用子類創(chuàng)建一個對象,并把這個對象的引用放到父類的對象中時,比如

Aa;或Aa;A=newB();Bb=newB();a=b;稱這個父類對象是子類對象的上轉(zhuǎn)型對象。上轉(zhuǎn)型對象對象的上轉(zhuǎn)型對象的實體是子類負(fù)責(zé)創(chuàng)建的,但上轉(zhuǎn)型對象會失去原對象的一些屬性和功能。上轉(zhuǎn)型對象具有如下特點:上轉(zhuǎn)型對象不能操作子類新增的成員變量,失掉了這部分屬性;不能使用子類新增的方法,失掉了一些功能。上轉(zhuǎn)型對象可以操作子類繼承或重寫的成員變量,也可以使用子類繼承的或重寫的方法。如果子類重寫了父類的某個方法后,當(dāng)對象的上轉(zhuǎn)對象調(diào)用這個方法時一定是調(diào)用了這個重寫的方法,因為程序在運行時知道,這個上轉(zhuǎn)對象的實體是子類創(chuàng)建的,只不過損失了一些功能而已。上轉(zhuǎn)型對象注:不要將父類創(chuàng)建的對象和子類對象的上轉(zhuǎn)型對象混淆??梢詫ο蟮纳限D(zhuǎn)型對象再強制轉(zhuǎn)換到一個子類對象,這時該子類對象又具備了子類所給的所有屬性和功能。不可以將父類創(chuàng)建的對象的引用賦值給子類聲明的對象,就像不能說”哺乳動物是老虎”。對象的上轉(zhuǎn)型對象對象新增的變量新增的方法繼承或重寫的變量繼承或重寫的方法上轉(zhuǎn)型對象class類人猿

{privateintn=100;voidcrySpeak(Strings){System.out.println(s);}}classPeopleextends類人猿

{voidcomputer(int

a,intb){intc=a*b;

System.out.println(c);}voidcrySpeak(Strings){System.out.println("**"+s+"**");}}classExample4_21{publicstaticvoidmain(String

args[]){類人猿monkey=newPeople();

monkey.crySpeak("Ilovethisgame");Peoplepeople=(People)monkey;puter(10,10);}}monkey.n=1000;puter(10,10);構(gòu)造方法的繼承子類可以繼承父類的構(gòu)造方法,遵循以下原則:無條件繼承父類的無參構(gòu)造方法如果子類定義了構(gòu)造方法,在創(chuàng)建對象時,先執(zhí)行繼承自父類的無參構(gòu)造方法,在執(zhí)行自己定義的構(gòu)造方法。對于父類的有參構(gòu)造方法,子類可以通過在自己的構(gòu)造方法中使用super關(guān)鍵字來調(diào)用它,但這個調(diào)用語句必須是子類構(gòu)造方法的第一個可執(zhí)行語句。classA{ publicA(){

System.out.println("Stringa"); }}classBextendsA{ publicB(){

System.out.println("Stringb"); }}classCextendsB{ publicC(){

System.out.println("Stringc"); }}publicclassConstructorTest{ publicstaticvoidmain(String

args[]){ Cc=newC(); }}運行結(jié)果是什么?本章小結(jié)

本章介紹了面向?qū)ο蟮膬蓚€重要特性:繼承和多態(tài)。通過extends關(guān)鍵字,可以從一個類派生出另外一個類。在新建一個子類對象時,父類的構(gòu)造方法首先執(zhí)行,然后再執(zhí)行子類的構(gòu)造方法。所有的類直接或間接繼承自O(shè)bject類,Object類提供了幾個常用的方法。final關(guān)鍵字保護了不需要繼承的類。覆蓋和重載是Java編程常用的兩個重要技術(shù)。通過覆蓋,定義子類時可以對父類的某些方法進行重定義。重載是在類中定義名稱相同,而參數(shù)不同的方法,方法調(diào)用時,程序會自動匹配相應(yīng)的方法。在重載中要注意的一點是,不能定義名稱相同,且參數(shù)也完全相同的方法。(1)java.lang——自動加載(2)java.io(3)java.awt(4)java.awt.event

(5)java.swing(6)java.util——高級類

(7)

(8)java.applet

(9)java.sql

(10)java.rmi——遠(yuǎn)程連接

(11)java.security——安全機制

常用的系統(tǒng)包創(chuàng)建包在程序中可以引用上面的系統(tǒng)包,也可以創(chuàng)建自己的包。package語句的格式如下:

package包名;例如:packagemypackage;創(chuàng)建了一個名為mypackage的包說明:(1)包可以嵌套,多層包語句的一般形式如下:

package包名1[.包名2.包名3.…]

創(chuàng)建包的層次也必須映射到用戶的文件系統(tǒng)中。例如聲明語句packagejava.awt.image;定義的包需要存儲到用戶的當(dāng)前文件系統(tǒng)的相應(yīng)文件夾java\awt\image中。(2)如果源程序中省略了package語句,源文件中定義的類文件就被默認(rèn)為是無名包的一部分,即源文件中定義的類文件也在一個包中,但是這個包沒有名字。提示:包名標(biāo)識符一般均為小寫字符組成包的示例packagefamily;classFather{

//類Father裝入包familyStringname;

intage;publicvoiddrive(){

System.out.println(“Icandrive.”);} }classSon{ //類Son裝入包familyStringname;

intage;publicvoidplay(){

System.out.println(“Icanplaybasketball.”);} }classDaughter{

//類Daughter裝入包familyStringname;

intage;publicvoidpaly(){

System.out.println(“Icanplaytableball.”);} }定義一個包,名為family定義了3個類:Father、Son和Daughter,并放在包family中import語句import語句的格式如下:

import<類名>;例如:importjava.awt.Class;說明:(1)如果要引入的類很多,且在同一個包中,則可以使用通配符“*”,如:importjava.io.*;(2)java.lang這個包無需顯式地引用,它總是被編譯器自動調(diào)入的。importjava.awt.*;importjava.applet.Applet;publicclassEx7_3extendsApplet{publicvoidpaint(Graphicsg){

g.drawString("import語句的應(yīng)用實例",20,20);}}編寫一個applet程序,實現(xiàn)在屏幕上顯示“import語句的應(yīng)用實例”。import語句示例再談作用域修飾符public修飾的公共變量有較大的作用域,對任何類都是可見的,既允許此變量所屬的類訪問,也允許同一個包中的其他類訪問,還允許其他包中的類訪問,所以public修飾的變量不具有保護功能。protected修飾的變量可以被定義它的類及其同一包中的子類直接訪問,也可以由同一包的其他類直接訪問。缺省(default)是指成員變量前沒有任何修飾符。一個類缺省修飾符時,它可以被定義它的類及其同一包中的其他類直接訪問。private修飾的成員變量具有很好的封裝性,只能被定義它的類訪問。packageexample;classAClass{privateintax,ay;publicvoidprint(){

intresult; result=ax+ay;

System.out.println("ax+ay="+result); }}classBClass{ publicint

bx,by;publicvoidprint(){

intresult; result=bx+by;

System.out.println("bx+by="+result); } }publicclassEx7_4{publicstaticvoidmain(String

arg[]){ {

AClass

aClass=newAClass();

aClass.ax=10;//Error

aClass.ay=20;//Error

aClass.print();

BClass

bClass=newBClass();

bClass.bx=15;

bClass.by=25;

bClass.print();} }為什么是錯誤的?Java的接口是另一種引用類型,也是面向?qū)ο蟮囊粋€重要機制。引入接口的目的是為了克服Java單繼承機制帶來的缺陷,同時免除C++中多繼承的復(fù)雜性。Java的接口在語法上類似于類的一種結(jié)構(gòu),它只定義一些常量和抽象方法,由接口聲明和接口體兩部分組成。接口定義格式:

[public|abstract]interface

接口名[extends接口列表]{常量聲明;抽象方法聲明;

}說明:(1)接口的修飾符可以是public或abstract,其中public或abstract缺省時也有效。

(2)接口也具有繼承性。定義接口時可以使用extends關(guān)鍵字定義該新接口是某個已經(jīng)存在的父接口的派生接口,它將繼承父接口的所有屬性和方法。定義接口接口示例(3)變量的修飾符只能是publicfinalstatic,所以在定義時不用顯式的使用修飾符。(4)接口中定義的方法總是abstract的,abstarct缺省也有效。與抽象類一樣,接口不需要構(gòu)造方法。下面是一個接口定義的例子。publicinterfaceInterfaceExample{StringName=“Java”;publicvoidprogramming();}類可以通過關(guān)鍵字implements實現(xiàn)接口,其語法如下:

[類修飾符]class類名[extends父類名][implements接口名列表]說明:1.在類的定義部分,如果一個類要實現(xiàn)多個接口,那么接口名之間要用逗號分隔。2.如果實現(xiàn)接口的類不是abstract修飾的抽象類,那么在類的定義部分必須實現(xiàn)接口中定義的所有方法,并給出具體的實現(xiàn)代

溫馨提示

  • 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

提交評論