聚合關(guān)系與抽象類(lèi)別_第1頁(yè)
聚合關(guān)系與抽象類(lèi)別_第2頁(yè)
聚合關(guān)系與抽象類(lèi)別_第3頁(yè)
聚合關(guān)系與抽象類(lèi)別_第4頁(yè)
聚合關(guān)系與抽象類(lèi)別_第5頁(yè)
已閱讀5頁(yè),還剩33頁(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、第10章 組成、聚合關(guān)係與抽象類(lèi)別10-1 類(lèi)別的組成關(guān)係 - 巢狀類(lèi)別10-2 類(lèi)別的聚合關(guān)係10-3 抽象類(lèi)別10-4 抽象類(lèi)別與介面10-5 常數(shù)類(lèi)別110-1 類(lèi)別的組成關(guān)係 - 巢狀類(lèi)別10-1-1 巢狀類(lèi)別10-1-2 內(nèi)層類(lèi)別的使用210-1-1 巢狀類(lèi)別-說(shuō)明巢狀類(lèi)別強(qiáng)調(diào)類(lèi)別間的關(guān)聯(lián)性,強(qiáng)調(diào)內(nèi)層類(lèi)別一定需要外層類(lèi)別,如果外層類(lèi)別的物件不存在,內(nèi)層類(lèi)別物件也不會(huì)存在,內(nèi)層的成員類(lèi)別稱(chēng)為內(nèi)層類(lèi)別(Inner Classes)。310-1-1 巢狀類(lèi)別-巢狀類(lèi)別的宣告Order巢狀類(lèi)別的宣告,如下所示:class Order / Order外層類(lèi)別 class OrderStatus

2、 / OrderStatus內(nèi)層類(lèi)別 Order類(lèi)別擁有成員類(lèi)別OrderStatus的內(nèi)層類(lèi)別,Order是巢狀類(lèi)別的外層類(lèi)別(Enclosing Class)。410-1-1 巢狀類(lèi)別-UML類(lèi)別圖UML類(lèi)別圖的組成關(guān)係是一種成品和零件(Whole-Part)的類(lèi)別關(guān)係,強(qiáng)調(diào)是成品的專(zhuān)屬零件,如下圖所示:510-1-1 巢狀類(lèi)別-特點(diǎn)巢狀類(lèi)別強(qiáng)調(diào)類(lèi)別間的關(guān)係。例如:訂單擁有訂單狀態(tài),所以O(shè)rderStatus類(lèi)別是Order類(lèi)別的一部分。巢狀類(lèi)別的內(nèi)層類(lèi)別也是外層類(lèi)別的成員,所以其他成員可以存取或呼叫內(nèi)層類(lèi)別的成員變數(shù)和方法,就算宣告成private也一樣可以;反之,內(nèi)層類(lèi)別的方法也可以直

3、接存取其他成員變數(shù)和呼叫成員方法。在Java程式檔案只允許一個(gè)宣告成public的類(lèi)別,如果巢狀類(lèi)別宣告成public,內(nèi)層類(lèi)別也一樣是public的存取權(quán)限,可以讓同一個(gè)程式檔案的多個(gè)類(lèi)別擁有public存取權(quán)限。610-1-2 內(nèi)層類(lèi)別的使用-說(shuō)明巢狀類(lèi)別的內(nèi)層類(lèi)別是外層類(lèi)別的零件,是其一部分,所以不能宣告static靜態(tài)的類(lèi)別變數(shù)和方法,而且只有在外層類(lèi)別的物件存在時(shí),內(nèi)層類(lèi)別才會(huì)存在。在第10-1-1節(jié)的程式範(fàn)例是使用外層類(lèi)別的物件變數(shù)來(lái)取得內(nèi)層類(lèi)別的物件,在這一節(jié)我們直接在主程式的程式碼建立內(nèi)層類(lèi)別的物件和指定成員變數(shù)值,以便說(shuō)明內(nèi)層類(lèi)別專(zhuān)屬零件的角色。710-1-2 內(nèi)層類(lèi)別的使用

4、-類(lèi)別範(fàn)例例如:Payment巢狀類(lèi)別宣告,如下所示:class Payment / Payment外層類(lèi)別 class Card / Card內(nèi)層類(lèi)別 Payment類(lèi)別是外層類(lèi)別,Card類(lèi)別是內(nèi)層類(lèi)別。810-1-2 內(nèi)層類(lèi)別的使用-建立巢狀類(lèi)別的物件在程式碼先使用new運(yùn)算子建立p1參考的Payment物件,接著使用Payment.Card宣告物件變數(shù)master,如下所示:Payment p1=new Payment(pay002,5600.0);Payment.Card master = p1.new Card();然後使用p1.new建立Card物件,最後指定內(nèi)層類(lèi)別物件的成員變

5、數(shù)值,如下所示:master.type = MASTER;master.number = 2433-4444-7890-1234;910-2 類(lèi)別的聚合關(guān)係10-2-1 一對(duì)一的聚合關(guān)係10-2-2 一對(duì)多的聚合關(guān)係10-2-3 遞迴的聚合關(guān)係1010-2 類(lèi)別的聚合關(guān)係在Java程式實(shí)作聚合關(guān)係和結(jié)合關(guān)係相同,其差異在於聚合關(guān)係的兩個(gè)類(lèi)別擁有成品和零件(Whole-Part)的類(lèi)別關(guān)係,並不是地位對(duì)等的兩個(gè)類(lèi)別。聚合關(guān)係和上一節(jié)組成關(guān)係的差異,在於組成關(guān)係的零件是專(zhuān)屬零件,所以組成關(guān)係的零件並不能單獨(dú)存在。聚合關(guān)係的零件可以共用,而且零件的物件可以單獨(dú)存在。1110-2-1 一對(duì)一的聚合關(guān)係

6、-說(shuō)明與UML類(lèi)別圖一對(duì)一的聚合關(guān)係是指類(lèi)別中擁有一個(gè)物件變數(shù)參考到其他類(lèi)別的物件,此類(lèi)別是成品(Whole),其他類(lèi)別是零件(Part)。例如:Student類(lèi)別擁有Date類(lèi)別的生日,生日是學(xué)生的零件。UML類(lèi)別圖,如下圖所示:1210-2-1 一對(duì)一的聚合關(guān)係-類(lèi)別宣告Java程式碼也是使用物件變數(shù)參考其他物件,其類(lèi)別宣告如下所示:class Student private Date birthday; class Date private Student student; 1310-2-1 一對(duì)一的聚合關(guān)係-Student()建構(gòu)子在Student()建構(gòu)子使用new運(yùn)算子來(lái)建立Dat

7、e物件,如下所示:birthday = new Date(d, m, y, this);上述建構(gòu)子的最後1個(gè)參數(shù)是指定Date物件的student物件變數(shù)值是目前的Student物件。1410-2-2 一對(duì)多的聚合關(guān)係-說(shuō)明與UML類(lèi)別圖一對(duì)多的聚合關(guān)係是指1個(gè)類(lèi)別對(duì)多個(gè)類(lèi)別,也就是成品需要同樣的多個(gè)零件。例如:一輛車(chē)有4個(gè)輪胎,Student學(xué)生擁有住家電話(huà)、宿舍電話(huà)和手機(jī)等多個(gè)Phone電話(huà)物件。UML類(lèi)別圖,如下圖所示:1510-2-2 一對(duì)多的聚合關(guān)係-類(lèi)別宣告筆者是使用物件陣列來(lái)實(shí)作一對(duì)多的聚合關(guān)係,如下所示:class Student private int pos = 0; pr

8、ivate Phone itsPhone = new Phone3; class Phone 1610-2-3 遞迴的聚合關(guān)係-說(shuō)明遞迴結(jié)合關(guān)係(Self-associations)可以使用在結(jié)合、組成或聚合關(guān)係,它是指類(lèi)別擁有參考到自已的指標(biāo),以聚合關(guān)係來(lái)說(shuō),類(lèi)別本身是成品;也是零件。1710-2-3 遞迴的聚合關(guān)係-UML類(lèi)別圖例如:學(xué)校的科系Department類(lèi)別可以分成很多子科系,每一個(gè)子科系物件也是一種Department類(lèi)別。UML類(lèi)別圖如下圖所示:1810-2-3 遞迴的聚合關(guān)係-類(lèi)別宣告我們一樣是使用物件陣列來(lái)建立一對(duì)多的遞迴聚合關(guān)係,如下所示:class Departmen

9、t private int pos; private Department itsSub= new Department2; 1910-2-3 遞迴的聚合關(guān)係-UML物件圖2010-3 抽象類(lèi)別-說(shuō)明在Java類(lèi)別宣告使用abstract修飾子,表示是一個(gè)抽象類(lèi)別(Abstract Class),抽象類(lèi)別並不能建立物件,只能被繼承用來(lái)建立子類(lèi)別。在抽象類(lèi)別宣告也可以使用abstract宣告方法為抽象方法,表示方法只有原型宣告,實(shí)作的程式碼是在子類(lèi)別建立,而且繼承的類(lèi)別一定要實(shí)作抽象方法。2110-3 抽象類(lèi)別-宣告抽象類(lèi)別抽象類(lèi)別是建立子類(lèi)別的原型,抽象方法類(lèi)似介面,可以視為建立子類(lèi)別的介面方

10、法。例如:抽象類(lèi)別Account宣告,如下所示:abstract class Account public String accountid; private double amount; public double interest; public abstract void calInterest(); public void setBalance(double a) public double getBalance() 2210-3 抽象類(lèi)別-繼承抽象類(lèi)別class SavingAccount extends Account public boolean haveCard; public

11、 SavingAccount(String id, double amount, double interest, boolean haveCard) public void calInterest() double amount = getBalance(); System.out.println(利息: “ +(amount*interest); 2310-3 抽象類(lèi)別-UML類(lèi)別圖2410-3 抽象類(lèi)別-抽象類(lèi)別的物件變數(shù)宣告抽象類(lèi)別不能建立物件,但是可以作為資料型態(tài),宣告參考子類(lèi)別的物件變數(shù),如下所示:Account s2 = new SavingAccount( 002-10-333

12、-123, 15000.00, 0.02, false);父類(lèi)別的物件變數(shù)可以參考子類(lèi)別的物件,以口語(yǔ)來(lái)說(shuō):SavingAccount物件也是一種Account物件。Account物件變數(shù)可以參考SavingAccount物件呼叫實(shí)作的抽象方法calInterest(),如下所示:s2.calInterest();2510-3 抽象類(lèi)別-抽象類(lèi)別的物件變數(shù)存取子類(lèi)別的成員Java提供instanceof運(yùn)算子判斷物件變數(shù)參考的哪一種物件,如下所示:if ( s2 instanceof SavingAccount ) . Account類(lèi)別的物件變數(shù)s2儲(chǔ)存的是SavingAccount物件的參

13、考,如果需要存取子類(lèi)別的成員,請(qǐng)先型態(tài)轉(zhuǎn)換成SavingAccount類(lèi)別的物件變數(shù),如下所示:SavingAccount s;s = (SavingAccount) s2;2610-4 抽象類(lèi)別與介面-抽象類(lèi)別與介面的差異在抽象類(lèi)別的方法可以宣告成抽象方法,也可以是一般方法;介面方法就只有宣告,在介面一定不會(huì)有實(shí)作程式碼。介面並不屬於類(lèi)別的繼承架構(gòu);抽象類(lèi)別則屬於類(lèi)別的繼承架構(gòu)。抽象類(lèi)別一定是繼承架構(gòu)的父類(lèi)別,但是,就算亳無(wú)關(guān)係的類(lèi)別也一樣可以實(shí)作同一個(gè)介面。一個(gè)類(lèi)別只能繼承一個(gè)抽象類(lèi)別,但是可以同時(shí)實(shí)作多個(gè)介面。2710-4 抽象類(lèi)別與介面-抽象類(lèi)別Java語(yǔ)言的類(lèi)別可以繼承抽象類(lèi)別且實(shí)作

14、介面。例如:圖形的Shape抽象類(lèi)別,其類(lèi)別宣告如下所示:abstract class Shape public double x; public double y; public abstract void area();2810-4 抽象類(lèi)別與介面-介面例如:IPerimeter介面,其介面宣告如下所示:interface IPerimeter void perimeter();2910-4 抽象類(lèi)別與介面-繼承抽象類(lèi)別且實(shí)作介面class Rectangle extends Shape implements IPerimeter public void area() System.out

15、.println(長(zhǎng)方形面積:“ +width*height); public void perimeter() System.out.println(長(zhǎng)方形周長(zhǎng):“ +2*(width+height); 3010-4 抽象類(lèi)別與介面-UML類(lèi)別圖3110-4 抽象類(lèi)別與介面-介面的物件變數(shù)1我們一樣可以使用介面來(lái)宣告物件變數(shù),參考到實(shí)作此介面的物件,如下所示:IPerimeter r3 = new Rectangle(15.0,15.0,4.0,8.0);以口語(yǔ)來(lái)說(shuō):Rectangle物件就是一種實(shí)作IPerimeter介面的物件。因?yàn)镮Perimeter宣告的物件變數(shù)可以參考Rectang

16、le物件,所以,可以呼叫實(shí)作的介面方法perimeter(),如下所示:r3.perimeter();3210-4 抽象類(lèi)別與介面-介面的物件變數(shù)2如同抽象類(lèi)別宣告的物件變數(shù),當(dāng)介面宣告的物件變數(shù)需要存取其參考類(lèi)別的成員時(shí),我們需要先型態(tài)轉(zhuǎn)換成Rectangle類(lèi)別的物件變數(shù),如下所示:Rectangle r;r = (Rectangle) r3;3310-5 常數(shù)類(lèi)別-說(shuō)明Java類(lèi)別除了可以使用public和abstract類(lèi)別修飾子外,還提供final修飾子來(lái)宣告常數(shù)類(lèi)別與常數(shù)方法。如果類(lèi)別宣告成final表示類(lèi)別不能被繼承;如果方法宣告成final表示此方法不可以覆寫(xiě)。3410-5 常數(shù)類(lèi)別-使用final修飾子的理由保密原因:基於保密理由,可以將一些類(lèi)別宣告成final,以防止子類(lèi)別存取或覆寫(xiě)原類(lèi)別的操作。設(shè)計(jì)原因:基於物件導(dǎo)向設(shè)計(jì)的需求,我們可以將某些類(lèi)別宣告成final,以避免子類(lèi)別繼承。3510-5 常數(shù)類(lèi)別-常數(shù)類(lèi)別與方法的範(fàn)例fina

溫馨提示

  • 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)論