Java程序設(shè)計大學(xué)教程_第1頁
Java程序設(shè)計大學(xué)教程_第2頁
Java程序設(shè)計大學(xué)教程_第3頁
Java程序設(shè)計大學(xué)教程_第4頁
Java程序設(shè)計大學(xué)教程_第5頁
已閱讀5頁,還剩10頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、 第四章 面向?qū)ο蟪绦蛟O(shè)計 面向?qū)ο蟮奶攸c主要概括為抽象性、繼承性、多態(tài)性和封裝性。本章我們將站在面向?qū)ο蟪绦蛟O(shè)計原則和方法的高度,圍繞這4個特點講解面向?qū)ο蟪绦蛟O(shè)計(OOP)的基本方法。 4.1原則和方法 面向?qū)ο蟪绦蛟O(shè)計的重要原則有:n分而治之原則n封裝原則n接口原則n信息隱藏原則n一般性原則n可擴展性原則n抽象原則 4.1原則和方法面向?qū)ο笤诔绦蛟O(shè)計中實現(xiàn)的方法:n分解與封裝分解與封裝 n繼承與合成繼承與合成 n接口與實現(xiàn)接口與實現(xiàn) n服務(wù)與客戶服務(wù)與客戶 4.2 繼承 對象的繼承是一種在保持對象差異性的同時共享對象相似性的復(fù)用。它是源自類的泛化機制。這種抽象機制允許類之間共享代碼,大大

2、減少了代碼長度并且使軟件易于維護。對象通過繼承,保證了實現(xiàn)部分緊內(nèi)聚和松耦合的良好特性 4.2.1 使用繼承 o基類與派生類基類與派生類nJava中派生類通過中派生類通過extends關(guān)鍵字繼承基類,并通過關(guān)鍵字繼承基類,并通過super關(guān)鍵字訪問基類的構(gòu)關(guān)鍵字訪問基類的構(gòu)造函數(shù)和方法。造函數(shù)和方法。nJava中所有的類都繼承了中所有的類都繼承了Object類的類的toString方法,方法,我們可以重寫并覆蓋我們可以重寫并覆蓋toString方法,使之帶有對方法,使之帶有對象的具體信息,以便我們跟蹤象的具體信息,以便我們跟蹤和調(diào)試對象。和調(diào)試對象。n繼承關(guān)系形成了樹狀的類層次繼承關(guān)系形成了樹

3、狀的類層次結(jié)構(gòu)。繼承產(chǎn)生的派生類不能結(jié)構(gòu)。繼承產(chǎn)生的派生類不能直接訪問其基類的直接訪問其基類的private成成員,但所有其他基類成員通過員,但所有其他基類成員通過繼承成為派生類的成員后,保繼承成為派生類的成員后,保持它們原來的成員的可訪問性,持它們原來的成員的可訪問性,并可在派生類中使用。并可在派生類中使用。面積 = length width周長 = 2 (length + width)Square需要重寫并覆蓋基類的calcPerimeter方法來計算周長。周長 = 4 length Square可以繼承基類Rectangle的calcArea方法來計算面積,無須另寫代碼圖 4 2在這個U

4、ML類圖中,Square繼承了Rectangle,是Rectangle類的擴展示例程序 4 1 Retangle類(Retangle.java)public class Retangle public Retangle(double l, double w) length = l; width = w; public double calcPerimeter() return 2 * (length + width); public double calcArea() return length * width; public String toString() return 長為 + len

5、gth + 寬為 + width + 的長方形; protected double length; private double width;示例程序 4 2 Square類(Square.java)public class Square extends Retangle public Square(double side) super(side,side); public double calcPerimeter() return length * 4; public String toString() return 邊長為 + length + 的正方形; 4.2.1 使用繼承 o基類與派

6、基類與派生類生類繼承在果繼承在果園系統(tǒng)中園系統(tǒng)中的使用的使用 4.2.2 繼承與合成 n面向?qū)ο蟪绦蛟O(shè)計中,通過合成或通過繼承都可以在不同的環(huán)境中重用已有的設(shè)計和實現(xiàn)。但經(jīng)驗表明,除非所有繼承的方法都有意義,否則還是應(yīng)當(dāng)優(yōu)先考慮使用合成而不是繼承。因為依賴于對象合成技術(shù)的設(shè)計有更好的重用性或更簡單。 4.3 多態(tài)n多態(tài)的意思是具有多種形態(tài),它是面向?qū)ο蟪绦蛟O(shè)計的重要思想方法。多態(tài)在面向?qū)ο蟪绦蛟O(shè)計中意味著通過動態(tài)綁定原理,使用單個變量來引用不同類的對象,自動調(diào)用引用對象類的對應(yīng)方法。n動態(tài)綁定機制,可以在運行期判定對象的類型,并調(diào)用其相應(yīng)的方法。也就是說,編譯器無需知道對象的類型,但方法的綁定

7、和調(diào)用機制能夠找出正確的方法體并加以調(diào)用。n同名方法的覆蓋(override)和重載(overload)是兩種完全不同的機制。n替代原則(substitution principle):基類應(yīng)該可以用其派生類代換。替代過程也是派生類向上轉(zhuǎn)型的過程。向上轉(zhuǎn)型是一種常用的安全的類型轉(zhuǎn)換,通過向上轉(zhuǎn)型可實現(xiàn)多態(tài)性。 4.3.1 多態(tài)與動態(tài)綁定 n派生類的對象具有多個類型n動態(tài)綁定實現(xiàn)多態(tài) public int gain() int g=input*2;/收益是投入的兩倍 return g; public int gain() /收益不變.public int gain() /收益-200.publi

8、c int gain() / 收益是投入的3倍 int g = input * 3; System.out.println(fruitName + 投入 + input + 凈收益 + g); return g;覆蓋(override)fruitsi.gain();程序運行時動態(tài)確定實現(xiàn)的gain方法數(shù)組屬性索引01234派生類類型TropicalFruitBerryTropicalFruitBerryCitrusFruit水果名稱香蕉葡萄菠蘿草莓橘子fruits0 = new TropicalFruit(香蕉, 1000);fruits1 = new Berry(葡萄, 2000);frui

9、ts2 = new TropicalFruit(菠蘿, 2000);fruits3 = new Berry(草莓, 1000);fruits4 = new CitrusFruit(橘子, 1000);我們可以像對待基類對象那樣對待派生類對象,它們的共性表現(xiàn)在繼承下來的同名類成員。所有繼承于共同基類的派生類對象可以當(dāng)做是這些基類的對象。 Food myFood;Fruit myFruit;CitrusFruit orange;orange = new CitrusFruit(橘子,1000); /創(chuàng)建橘子對象myFood = orange(); /相當(dāng)于myFood = (Food)orange

10、;myFood.eat(); /調(diào)用的是CitrusFruit的eat方法:剝皮吃橘子myFruit = orange; /相當(dāng)于myFruit = (Fruit)orange;myFruit.eat(); /調(diào)用的還是CitrusFruit的eat方法:剝皮吃橘子 4.3.2 方法的綁定 n所謂的方法綁定(Binding)就是建立方法調(diào)用(Method Call)和方法本體(Method Body)之間的關(guān)聯(lián)。如果方法是“早綁定”、“先期綁定”的,也就是在編譯時編譯器就能準(zhǔn)確地判斷應(yīng)該調(diào)用的那個方法稱為靜態(tài)綁定方法。Java中這類方法包括private、static、final方法以及構(gòu)造函

11、數(shù)。如果方法是“晚綁定”、“后期綁定”的,也就是在運行時由虛擬機調(diào)用同該對象變量所指對象的實際類型相匹配的方法版本,動態(tài)決定的方法,稱為動態(tài)綁定方法。Java中除了private、static、final方法以及構(gòu)造函數(shù)外的其他方法都是動態(tài)綁定方法。nJava語言中使用關(guān)鍵字final來定義常量。但是關(guān)鍵字final還有另外2個重要用途:一個是阻止類(final類)被繼承,另一個是阻止方法(final方法)被覆蓋(override)。 n抽象方法是一種沒有實現(xiàn)的方法。定義有抽象方法的類我們稱之為抽象類。抽象方法和抽象類都使用abstract關(guān)鍵字來標(biāo)識。含有抽象方法的類必須定義為抽象類,但是沒

12、有抽象方法的類也可以定義為抽象類。但無論如何,抽象類都不能創(chuàng)建實例。 作業(yè)Person- 姓名- 年齡+ speak()+ speakto( person )ManWoman在 man 和 woman 子類中重寫 speak 方法,使之具有性別特征。Person p;p = new Man();p.speak();P = new Woman()p.speak(); 4.4 接口 n接口的概念是建立在封裝的基礎(chǔ)之上。在面向?qū)ο蟪绦蛟O(shè)計中,封裝是指對象的使用者通過預(yù)先定義的接口關(guān)聯(lián)到某一對象的服務(wù)和數(shù)據(jù)時,無需知道這些服務(wù)是如何實現(xiàn)的。因此接口在面向?qū)ο蟪绦蛟O(shè)計中有著重要的地位。n在Java中,抽

13、象類和接口(Interface)都是一種接口抽象機制,符合接口的特點。習(xí)慣上我們只把Java語法中的接口(Interface)作為接口的窄定義。該接口是一種類型,它定義了能被一個類實現(xiàn)的方法。 4.4.1 接口的概念 接口是指一些方法特征的集合,它關(guān)心的是方法的特征定義(例如方法的名稱、參數(shù)的類型及數(shù)量),而不是方法的具體實現(xiàn)。在Java中,抽象類和接口都是一種接口抽象機制,符合接口的特點。n接口提供了一種抽象機制接口提供了一種抽象機制 n接口使即插即用變得可能接口使即插即用變得可能 n接口針對抽象而不是針對實現(xiàn)接口針對抽象而不是針對實現(xiàn) 4.4.2 Java接口 o定義接口定義接口o實現(xiàn)接口

14、實現(xiàn)接口o接口與多重繼承接口與多重繼承 public interface 接口名接口名 extends 祖先接口祖先接口名名 返回類型返回類型 方法名方法名(參數(shù)列表參數(shù)列表); . 類型類型 常量字段名常量字段名 = 值值; .public class 類名類名 extends 祖先類名祖先類名 implements 接口名接口名 , 其它接口名其它接口名. /類的實現(xiàn)代碼類的實現(xiàn)代碼 . 下面代碼通過實現(xiàn)Writeable接口和Eatable接口的Paper類代碼,演示了多重繼承的程序設(shè)計: public class Paper implements Eatable, Writeable

15、public void eat() System.out.println(撕紙吃,+TASTELESS); public void write() System.out.println(在紙上書寫:); 4.4.3 接口應(yīng)用實例 n使用接口的好處是便于系統(tǒng)的擴展、維護和重用。接口使用接口的好處是便于系統(tǒng)的擴展、維護和重用。接口的使用使得代碼模塊之間的耦合減弱。具體表現(xiàn)在對象的使用使得代碼模塊之間的耦合減弱。具體表現(xiàn)在對象之間的依賴關(guān)系弱化為客戶之間的依賴關(guān)系弱化為客戶服務(wù)的關(guān)系,即客戶對服務(wù)的關(guān)系,即客戶對象請求服務(wù),服務(wù)對象提供服務(wù),而接口則成了提供服象請求服務(wù),服務(wù)對象提供服務(wù),而接口則成了提供服務(wù)的一種契約

溫馨提示

  • 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

提交評論