版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、 第四章 面向?qū)ο蟪绦蛟O(shè)計(jì) 面向?qū)ο蟮奶攸c(diǎn)主要概括為抽象性、繼承性、多態(tài)性和封裝性。本章我們將站在面向?qū)ο蟪绦蛟O(shè)計(jì)原則和方法的高度,圍繞這4個(gè)特點(diǎn)講解面向?qū)ο蟪绦蛟O(shè)計(jì)(OOP)的基本方法。 4.1原則和方法 面向?qū)ο蟪绦蛟O(shè)計(jì)的重要原則有:n分而治之原則n封裝原則n接口原則n信息隱藏原則n一般性原則n可擴(kuò)展性原則n抽象原則 4.1原則和方法面向?qū)ο笤诔绦蛟O(shè)計(jì)中實(shí)現(xiàn)的方法:n分解與封裝分解與封裝 n繼承與合成繼承與合成 n接口與實(shí)現(xiàn)接口與實(shí)現(xiàn) n服務(wù)與客戶服務(wù)與客戶 4.2 繼承 對(duì)象的繼承是一種在保持對(duì)象差異性的同時(shí)共享對(duì)象相似性的復(fù)用。它是源自類的泛化機(jī)制。這種抽象機(jī)制允許類之間共享代碼,大大
2、減少了代碼長(zhǎng)度并且使軟件易于維護(hù)。對(duì)象通過繼承,保證了實(shí)現(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方法,使之帶有對(duì)方法,使之帶有對(duì)象的具體信息,以便我們跟蹤象的具體信息,以便我們跟蹤和調(diào)試對(duì)象。和調(diào)試對(duì)象。n繼承關(guān)系形成了樹狀的類層次繼承關(guān)系形成了樹
3、狀的類層次結(jié)構(gòu)。繼承產(chǎn)生的派生類不能結(jié)構(gòu)。繼承產(chǎn)生的派生類不能直接訪問其基類的直接訪問其基類的private成成員,但所有其他基類成員通過員,但所有其他基類成員通過繼承成為派生類的成員后,保繼承成為派生類的成員后,保持它們?cè)瓉淼某蓡T的可訪問性,持它們?cè)瓉淼某蓡T的可訪問性,并可在派生類中使用。并可在派生類中使用。面積 = length width周長(zhǎng) = 2 (length + width)Square需要重寫并覆蓋基類的calcPerimeter方法來計(jì)算周長(zhǎng)。周長(zhǎng) = 4 length Square可以繼承基類Rectangle的calcArea方法來計(jì)算面積,無須另寫代碼圖 4 2在這個(gè)U
4、ML類圖中,Square繼承了Rectangle,是Rectangle類的擴(kuò)展示例程序 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 長(zhǎng)為 + len
5、gth + 寬為 + width + 的長(zhǎng)方形; 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 邊長(zhǎng)為 + length + 的正方形; 4.2.1 使用繼承 o基類與派
6、基類與派生類生類繼承在果繼承在果園系統(tǒng)中園系統(tǒng)中的使用的使用 4.2.2 繼承與合成 n面向?qū)ο蟪绦蛟O(shè)計(jì)中,通過合成或通過繼承都可以在不同的環(huán)境中重用已有的設(shè)計(jì)和實(shí)現(xiàn)。但經(jīng)驗(yàn)表明,除非所有繼承的方法都有意義,否則還是應(yīng)當(dāng)優(yōu)先考慮使用合成而不是繼承。因?yàn)橐蕾囉趯?duì)象合成技術(shù)的設(shè)計(jì)有更好的重用性或更簡(jiǎn)單。 4.3 多態(tài)n多態(tài)的意思是具有多種形態(tài),它是面向?qū)ο蟪绦蛟O(shè)計(jì)的重要思想方法。多態(tài)在面向?qū)ο蟪绦蛟O(shè)計(jì)中意味著通過動(dòng)態(tài)綁定原理,使用單個(gè)變量來引用不同類的對(duì)象,自動(dòng)調(diào)用引用對(duì)象類的對(duì)應(yīng)方法。n動(dòng)態(tài)綁定機(jī)制,可以在運(yùn)行期判定對(duì)象的類型,并調(diào)用其相應(yīng)的方法。也就是說,編譯器無需知道對(duì)象的類型,但方法的綁定
7、和調(diào)用機(jī)制能夠找出正確的方法體并加以調(diào)用。n同名方法的覆蓋(override)和重載(overload)是兩種完全不同的機(jī)制。n替代原則(substitution principle):基類應(yīng)該可以用其派生類代換。替代過程也是派生類向上轉(zhuǎn)型的過程。向上轉(zhuǎn)型是一種常用的安全的類型轉(zhuǎn)換,通過向上轉(zhuǎn)型可實(shí)現(xiàn)多態(tài)性。 4.3.1 多態(tài)與動(dòng)態(tài)綁定 n派生類的對(duì)象具有多個(gè)類型n動(dòng)態(tài)綁定實(shí)現(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();程序運(yùn)行時(shí)動(dòng)態(tài)確定實(shí)現(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);我們可以像對(duì)待基類對(duì)象那樣對(duì)待派生類對(duì)象,它們的共性表現(xiàn)在繼承下來的同名類成員。所有繼承于共同基類的派生類對(duì)象可以當(dāng)做是這些基類的對(duì)象。 Food myFood;Fruit myFruit;CitrusFruit orange;orange = new CitrusFruit(橘子,1000); /創(chuàng)建橘子對(duì)象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)。如果方法是“早綁定”、“先期綁定”的,也就是在編譯時(shí)編譯器就能準(zhǔn)確地判斷應(yīng)該調(diào)用的那個(gè)方法稱為靜態(tài)綁定方法。Java中這類方法包括private、static、final方法以及構(gòu)造函
11、數(shù)。如果方法是“晚綁定”、“后期綁定”的,也就是在運(yùn)行時(shí)由虛擬機(jī)調(diào)用同該對(duì)象變量所指對(duì)象的實(shí)際類型相匹配的方法版本,動(dòng)態(tài)決定的方法,稱為動(dòng)態(tài)綁定方法。Java中除了private、static、final方法以及構(gòu)造函數(shù)外的其他方法都是動(dòng)態(tài)綁定方法。nJava語(yǔ)言中使用關(guān)鍵字final來定義常量。但是關(guān)鍵字final還有另外2個(gè)重要用途:一個(gè)是阻止類(final類)被繼承,另一個(gè)是阻止方法(final方法)被覆蓋(override)。 n抽象方法是一種沒有實(shí)現(xiàn)的方法。定義有抽象方法的類我們稱之為抽象類。抽象方法和抽象類都使用abstract關(guān)鍵字來標(biāo)識(shí)。含有抽象方法的類必須定義為抽象類,但是沒
12、有抽象方法的類也可以定義為抽象類。但無論如何,抽象類都不能創(chuàng)建實(shí)例。 作業(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è)計(jì)中,封裝是指對(duì)象的使用者通過預(yù)先定義的接口關(guān)聯(lián)到某一對(duì)象的服務(wù)和數(shù)據(jù)時(shí),無需知道這些服務(wù)是如何實(shí)現(xiàn)的。因此接口在面向?qū)ο蟪绦蛟O(shè)計(jì)中有著重要的地位。n在Java中,抽
13、象類和接口(Interface)都是一種接口抽象機(jī)制,符合接口的特點(diǎn)。習(xí)慣上我們只把Java語(yǔ)法中的接口(Interface)作為接口的窄定義。該接口是一種類型,它定義了能被一個(gè)類實(shí)現(xiàn)的方法。 4.4.1 接口的概念 接口是指一些方法特征的集合,它關(guān)心的是方法的特征定義(例如方法的名稱、參數(shù)的類型及數(shù)量),而不是方法的具體實(shí)現(xiàn)。在Java中,抽象類和接口都是一種接口抽象機(jī)制,符合接口的特點(diǎn)。n接口提供了一種抽象機(jī)制接口提供了一種抽象機(jī)制 n接口使即插即用變得可能接口使即插即用變得可能 n接口針對(duì)抽象而不是針對(duì)實(shí)現(xiàn)接口針對(duì)抽象而不是針對(duì)實(shí)現(xiàn) 4.4.2 Java接口 o定義接口定義接口o實(shí)現(xiàn)接口
14、實(shí)現(xiàn)接口o接口與多重繼承接口與多重繼承 public interface 接口名接口名 extends 祖先接口祖先接口名名 返回類型返回類型 方法名方法名(參數(shù)列表參數(shù)列表); . 類型類型 常量字段名常量字段名 = 值值; .public class 類名類名 extends 祖先類名祖先類名 implements 接口名接口名 , 其它接口名其它接口名. /類的實(shí)現(xiàn)代碼類的實(shí)現(xiàn)代碼 . 下面代碼通過實(shí)現(xiàn)Writeable接口和Eatable接口的Paper類代碼,演示了多重繼承的程序設(shè)計(jì): 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)用實(shí)例 n使用接口的好處是便于系統(tǒng)的擴(kuò)展、維護(hù)和重用。接口使用接口的好處是便于系統(tǒng)的擴(kuò)展、維護(hù)和重用。接口的使用使得代碼模塊之間的耦合減弱。具體表現(xiàn)在對(duì)象的使用使得代碼模塊之間的耦合減弱。具體表現(xiàn)在對(duì)象之間的依賴關(guān)系弱化為客戶之間的依賴關(guān)系弱化為客戶服務(wù)的關(guān)系,即客戶對(duì)服務(wù)的關(guān)系,即客戶對(duì)象請(qǐng)求服務(wù),服務(wù)對(duì)象提供服務(wù),而接口則成了提供服象請(qǐng)求服務(wù),服務(wù)對(duì)象提供服務(wù),而接口則成了提供服務(wù)的一種契約
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 廣東省梅州市2015年中考政治真題試題(含解析)
- 資本教育培訓(xùn)政策解讀
- led車出租合同范例
- 鄰居單間出租合同范例
- 違造借款合同范例
- 公司電路維修合同范例
- 項(xiàng)目招商商鋪?zhàn)赓U合同范例
- 汽車租賃同城轉(zhuǎn)讓合同范例
- 足浴勞動(dòng)合同范例
- 廣地出租合同范例
- 2025眼科護(hù)理工作計(jì)劃
- 校園牛奶消費(fèi)推廣方案
- 非甾體抗炎藥圍術(shù)期鎮(zhèn)痛專家共識(shí)(2024 版)解讀
- 期末試卷(試題)-2024-2025學(xué)年三年級(jí)上冊(cè)數(shù)學(xué)蘇教版
- 天津市南開區(qū)2023-2024學(xué)年四年級(jí)上學(xué)期期末英語(yǔ)試題
- 期末考試-公共財(cái)政概論-章節(jié)習(xí)題
- 加固工程竣工驗(yàn)收資料(質(zhì)量驗(yàn)收表全套)
- 衛(wèi)生技術(shù)人員執(zhí)業(yè)監(jiān)管記錄
- 齒輪傳動(dòng)的設(shè)計(jì)論文
- 國(guó)家開放大學(xué)《納稅籌劃》章節(jié)測(cè)試參考答案
- 上海市醫(yī)療器械經(jīng)營(yíng)質(zhì)量管理規(guī)范實(shí)施細(xì)則
評(píng)論
0/150
提交評(píng)論