第09章 抽象類(lèi)和接口.ppt_第1頁(yè)
第09章 抽象類(lèi)和接口.ppt_第2頁(yè)
第09章 抽象類(lèi)和接口.ppt_第3頁(yè)
第09章 抽象類(lèi)和接口.ppt_第4頁(yè)
第09章 抽象類(lèi)和接口.ppt_第5頁(yè)
已閱讀5頁(yè),還剩20頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、第9章 抽象類(lèi)和接口,面向?qū)ο蠹夹g(shù),2,學(xué)習(xí)目標(biāo),設(shè)計(jì)并使用抽象類(lèi) Calendar類(lèi)與GregorianCalendar類(lèi) 聲明接口模擬多繼承關(guān)系 使用Comparable接口定義自然順序 了解抽象類(lèi)與接口的異同 聲明自定義接口 Cloneable接口 包裝類(lèi) 創(chuàng)建一般的排序方法 JDK1.5 基本數(shù)據(jù)類(lèi)型與包裝類(lèi)之間自動(dòng)轉(zhuǎn)換,面向?qū)ο蠹夹g(shù),3,9.1 引言,抽象類(lèi)(abstract class)是指其表達(dá)的概念非常抽象, 以至于它沒(méi)有具體的實(shí)例. 從幾個(gè)類(lèi)中派生出一個(gè)子類(lèi)稱(chēng)為 “多重繼承”. Java的類(lèi)不支持多重繼承, 稱(chēng)為 “單繼承”. Java中可以使用接口(interface)得到

2、多重繼承的效果.,面向?qū)ο蠹夹g(shù),4,9.2 抽象類(lèi),抽象方法: 只有方法頭沒(méi)有方法體.用abstract修飾. 抽象類(lèi): 用abstract修飾的類(lèi), 不能用new創(chuàng)建對(duì)象.,public abstract class TheAbstarctClass public abstract void abstractMethod(); ,面向?qū)ο蠹夹g(shù),5,9.2 抽象類(lèi),什么時(shí)候需要設(shè)計(jì)并使用抽象類(lèi)?,以幾何對(duì)象為例. 許多幾何對(duì)象, 如圓、矩形和圓柱等, 有很多共同的屬性和行為, 如共同的屬性: 使用特定顏色繪制, 填充或不填充; 共同的方法: 計(jì)算面積和周長(zhǎng)等. 可以定義抽象類(lèi)Geometric

3、Object表示一般的幾何對(duì)象概念, 包含共同的屬性和方法. 其他具體的幾何對(duì)象可以作為該抽象類(lèi)的子類(lèi), 可以共享抽象父類(lèi)中的屬性和行為.,面向?qū)ο蠹夹g(shù),6,幾何對(duì)象問(wèn)題的UML類(lèi)圖,GeometricObject.java Circle.java Rectangle.java Cylinder.java,面向?qū)ο蠹夹g(shù),7,9.2 抽象類(lèi) - 注意問(wèn)題,非抽象類(lèi)不能包含抽象方法. 抽象類(lèi)不能用new運(yùn)算符實(shí)例化, 但可以有構(gòu)造方法. 包含抽象方法的類(lèi)必須是抽象的, 但也允許聲明沒(méi)有抽象方法的抽象類(lèi). 具體的父類(lèi)也可以派生抽象的子類(lèi). 子類(lèi)可以將父類(lèi)的具體方法覆蓋為抽象方法.(少用) 抽象類(lèi)不能

4、創(chuàng)建對(duì)象, 但可以聲明對(duì)象引用.GeometricObject geo = new GeometricObject10; 例: 使用GeometricObject類(lèi). TestGeometricObject.java,面向?qū)ο蠹夹g(shù),8,9.3 Calendar與GregorianCalendar,java.util.Date, 表示特定的瞬間, 精確到毫秒. java.util.Calendar, 抽象類(lèi), 為特定瞬間與一組諸如 YEAR、MONTH、DAY_OF_MONTH、HOUR 等 日歷字段之間的轉(zhuǎn)換提供了一些方法, 并為操作日歷字段提供了一些方法. java.util.Gregori

5、anCalendar, 是 Calendar的一個(gè)具體子類(lèi),提供了世界上大多數(shù)國(guó)家/地區(qū)使用的標(biāo)準(zhǔn)日歷系統(tǒng)。,面向?qū)ο蠹夹g(shù),9,9.4 接口,接口(interface)是一種與類(lèi)相似的結(jié)構(gòu), 只包含常量和抽象方法. 接口聲明的語(yǔ)法修飾符 interface 接口名 /* 常量聲明 */ /* 抽象方法聲明 */ 每個(gè)接口在編譯時(shí)生成一個(gè).class, 接口不能用new創(chuàng)建對(duì)象實(shí)例.,面向?qū)ο蠹夹g(shù),10,9.4 接口,例: 設(shè)計(jì)一個(gè)比較兩個(gè)對(duì)象大小的一般方法.,/ interface for comparing objects, defined in java.lang package java

6、.lang; public interface Comparable public int compareTo(Object o); ,compareTo比較當(dāng)前對(duì)象與參數(shù)對(duì)象的大小, 返回值: 負(fù)整數(shù) 當(dāng)前對(duì)象小于參數(shù)對(duì)象 相等 正整數(shù) 當(dāng)前對(duì)象大于參數(shù)對(duì)象,面向?qū)ο蠹夹g(shù),11,9.4 接口,定義一個(gè)max方法, 使用Comparable接口.,public class Max public static Object max(Object o1, Object o2) if(Comparable o1).compareTo(o2) 0) return o1; else return o2;

7、 ,Java類(lèi)庫(kù)中許多類(lèi)實(shí)現(xiàn)了Comparable接口, 定義了自然順序,因此可以使用max方法.,String s1 = “abcdef”, s2 = “abcdee”; String s3 = (String)Max.max(s1, s2);,例如:,面向?qū)ο蠹夹g(shù),12,9.4.1 實(shí)現(xiàn)接口,一個(gè)類(lèi)使用implements關(guān)鍵字實(shí)現(xiàn)一個(gè)或多個(gè)接口.,修飾符 class 類(lèi)名 implements 接口1, , 接口n /* 類(lèi)體 */ ,關(guān)鍵字implements表示類(lèi)繼承了后面列出的每個(gè)接口中的所有常量, 并實(shí)現(xiàn)接口的全部或部分方法. 所謂 “實(shí)現(xiàn)”是指在類(lèi)中覆蓋接口中聲明的抽象方法.,

8、面向?qū)ο蠹夹g(shù),13,9.4.1 實(shí)現(xiàn)接口,public class ComparableRectangle extends Rectangle implements Comparable public ComparableRectangle(double w, double h) super(w, h); public int compareTo(Object o) if (findArea() (ComparableRectangle)o).findArea() return 1; else if (findArea() (ComparableRectangle)o).findArea()

9、return -1; else return 0; ,面向?qū)ο蠹夹g(shù),14,9.4.1 實(shí)現(xiàn)接口,UML圖形符號(hào),接口,實(shí)現(xiàn),ComparableRectangle r1 = new ComparableRectangle(4, 5); ComparableRectangle r1 = new ComparableRectangle(3, 6); Max.max(r1, r2);,面向?qū)ο蠹夹g(shù),15,9.4.2 接口與抽象類(lèi),接口的數(shù)據(jù)域必須是常量; 抽象類(lèi)有非常量. 接口的方法必須是抽象的; 抽象類(lèi)有具體方法.,接口與抽象類(lèi)的區(qū)別:,接口中常量的訪問(wèn):接口名.常量名 例如: T1.K,面向?qū)ο?/p>

10、技術(shù),16,9.4.2 接口與抽象類(lèi),一個(gè)類(lèi)可以extends一個(gè)父類(lèi), 同時(shí)implements多個(gè)接口.,public class 子類(lèi) extends 父類(lèi) implements 父接口1, , 父接口N ,一個(gè)接口可以extends多個(gè)父接口, 稱(chēng)為 “子接口”.,public class 子接口 extends 父接口1, , 父接口N ,面向?qū)ο蠹夹g(shù),17,9.4.2 接口與抽象類(lèi),interface CanFight void fight(); interface CanSwim void swim(); interface CanFly void fly(); interfac

11、e ActionList extends CanFight,CanSwim,CanFly,接口繼承的示例,問(wèn)題: 在接口ActionList中有幾個(gè)方法?,面向?qū)ο蠹夹g(shù),18,9.4.2 接口與抽象類(lèi),interface ActionList void fight(); void swim();abstract class Human implements ActionList public void swim() class Hero implements ActionList public void fight() public void swim() ,接口實(shí)現(xiàn)示例,問(wèn)題1: 為什么Hu

12、man是抽象類(lèi)而Hero是具體類(lèi)? 問(wèn)題2: 為什么Human和Hero中的方法都是public的?,面向?qū)ο蠹夹g(shù),19,9.4.2 接口與抽象類(lèi)接口類(lèi)型引用,1.可以使用接口類(lèi)型聲明的引用訪問(wèn)任何實(shí)現(xiàn)了該接口的具體類(lèi)的對(duì)象.,2.使用接口類(lèi)型的引用只能訪問(wèn)類(lèi)中實(shí)現(xiàn)的屬于該接口的方法.,interface CanFly void fly(); interface CanRead void read(); class Hero implements CanFly,CanRead public void fly() System.out.println(fly!); public void rea

13、d() System.out.println(read!); CanFly f = new Hero(); / 正確 CanRead r = new Hero(); / 正確 f.fly(); / 正確! f.read(); / 錯(cuò)誤! 不能訪問(wèn)!,面向?qū)ο蠹夹g(shù),20,9.4.3 創(chuàng)建自定義接口的例子,public interface Edible public String howToEat(); ,class Animal class Chicken extends Animal implements Edible public String howToEat() return “Fry

14、it”; ,class Fruit implements Edible public String howToEat() return “Eat it Fresh”; ,class Apple extends Fruit public String howToEat() return “Make apple cider”; ,class Orange extends Fruit public String howToEat() return “Make orange juice”; ,面向?qū)ο蠹夹g(shù),21,9.4.4 可克隆接口Cloneable,Cloneable接口的定義如下:,packag

15、e java.lang; public interface Cloneable ,主體為空的接口稱(chēng)為 “標(biāo)記接口”. 標(biāo)記接口用于說(shuō)明實(shí)現(xiàn)它的類(lèi)具有某種必備的特性. Cloneable接口說(shuō)明實(shí)現(xiàn)了它的類(lèi)是可復(fù)制的, 即該類(lèi)的對(duì)象可以使用clone()方法進(jìn)行復(fù)制. Java類(lèi)庫(kù)中許多類(lèi)均實(shí)現(xiàn)了Cloneable接口.,面向?qū)ο蠹夹g(shù),22,9.4.4 可克隆接口Cloneable,例如: Calendar cal1 = new GregorianCalendar(2003, 2, 1); Calendar cal2 = (Calendar)cal1.clone(); System.out.pr

16、intln(“cal1 = cal2 是 ” + (cal1 = cal2); System.out.println(“cal1.equals(cal2) 是 ” + cal1.equals(cal2);,輸出結(jié)果為: cal1 = cal2 是 false cal1.equals(cal2) 是 true,面向?qū)ο蠹夹g(shù),23,9.4.4 可克隆接口Cloneable,自定義實(shí)現(xiàn)復(fù)制的類(lèi), 必須滿足以下2點(diǎn): 1. 該類(lèi)必須實(shí)現(xiàn)java.lang.Cloneable接口. 2. 該類(lèi)必須覆蓋Object類(lèi)的clone方法.,Object類(lèi)中的clone方法的定義如下: protected native Object Cloneable() throws CloneNotSupportedException;,覆蓋該方法時(shí), 需要將protected改為public, 并在覆蓋方法中使用super.clone()調(diào)用父類(lèi)的復(fù)制方法.,講解例子: House.java,面向?qū)ο蠹夹g(shù),24,9.4.4 可克隆接口Cloneable,House.java中實(shí)現(xiàn)的是 “淺復(fù)制”, 而不是 “深復(fù)制”.,(1) House house1 =

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論