ch07 巢狀類別

22
Ch07 介介介介介介介 介介介介介介介介 (II)

Upload: kobe

Post on 04-Jan-2016

84 views

Category:

Documents


0 download

DESCRIPTION

Ch07 巢狀類別. 物件導向程式設計 (2). 巢狀類別 - 說明. 在 Java 類別之中可以擁有其它類別的成員,這種類別稱為「巢狀類別」( Nested Classes )。 巢狀類別強調類別之間的關係,成員類別稱為「內層類別」( Inner Classes )。 例如: Employee 巢狀類別擁有成員類別 Phone 的內層類別, Employee 是巢狀類別的「外層類別」( Enclosing Class )。. 巢狀類別 - 圖例. Employee 物件的圖例,如下圖所示:. 巢狀類別 - 範例. - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: Ch07  巢狀類別

Ch07 介面與多重繼承 物件導向程式設計 (II)

Page 2: Ch07  巢狀類別

單一繼承 vs 多重繼承(1/2)

• Java 的繼承是屬於單一繼承,C++ 的繼承是屬於多重繼承• 多重繼承是指:指一個類別

能夠繼承多個父類別• 在許多時候多重繼承的性質

是相當有用。• 在 Java ,多重繼承的性質

交給介面。

2

Page 3: Ch07  巢狀類別

單一繼承 vs 多重繼承 (2/2)• 多重繼承的性質很有用,現實環境中,處處是多重繼承,

想想以下情境:你有一隻手機,它有 PDA 和 GPS 的功能,有一天, ToTo 跟你

借 GPS如果 1 :你怕 ToTo 弄壞了,他的媽媽又不會賠,這時,你可以

採用『單一繼承』的說法, “不好意思,我有行動電話”如果 2 :你不怕 ToTo 弄壞,因為他弄壞了,你就可以順理成章

的成為他的小童星經紀人,好好利用他大賺一筆;則,你可以採用『多重繼承』的說法, “我有一隻手機,它有 GPS 的功能,借給你”

3

Page 4: Ch07  巢狀類別

動動小手時間 (1)• 請繪出上一頁的行動電話的繼承圖

4

Page 5: Ch07  巢狀類別

介面 (1/2)

• 介面中定義的方法就像是飲料販賣機上的按鈕

5

Page 6: Ch07  巢狀類別

介面 (2/2)• 介面( Interface )是在類別繼承架構中定義類別行為,內

含常數和方法宣告,但是並沒有實作程式碼

6

Page 7: Ch07  巢狀類別

介面的定義與實作 (1/3)

• 定義介面的語法:修飾字 interface 介面名稱{ // 靜態常數定義 // 抽象方法宣告}

• 介面定義的例子:interface MyInterface{ int i=2;    // 已預設使用 public 、 final 、 static void m(); // 已預設使用 public 、 abstract}

7

Page 8: Ch07  巢狀類別

介面的定義與實作 (2/3)• 實作介面的類別定義語法:

修飾字 class 類別名稱 implements 介面名稱{

// 包含實作方法的敘述}

8

Page 9: Ch07  巢狀類別

介面的定義與實作 (3/3)

• 介面多重繼承的語法:interface 子介面 extends 父介面一 , 父介面二 , ...{

// 新增的靜態常數及抽象方法}

• 類別實作多個介面的語法:class 類別名稱 implements 介面一 , 介面二 , ...{

// 類別主體敘述} 9

Page 10: Ch07  巢狀類別

範例 1: 宣告與使用介面(1/4)• UML 類別圖,如下圖所示:

10

Page 11: Ch07  巢狀類別

範例 1: 宣告與使用介面(2/4)• AreaInterface 介面,如下所示:

interface AreaInterface{ final double PI = 3.1415926; void area();}

11

Page 12: Ch07  巢狀類別

範例 1: 宣告與使用介面(3/4)• 接著 Circle 類別可以實作這個介面,如下所示:

class Circle extends Shape implements AreaInterface{ ……… public void area() { System.out.println("X 座標 : " + x); System.out.println("Y 座標 : " + y); System.out.println(" 圓半徑 : " + r); System.out.println(" 圓面積 : " + PI*r*r); } } 12

Page 13: Ch07  巢狀類別

範例 1: 宣告與使用介面(4/4)

1. abstract class Shape06012. { public double x;3. public double y;4. }5. interface AreaInterface06016. { final double PI = 3.1415926;7. void area();8. }9. class Circle0601 extends Shape0601 implements

AreaInterface060110.{ public double r;11. public Circle0601(double x, double y, double r)12. { this.x = x;13. this.y = y;14. this.r = r;15. }16. public void area()17. { System.out.println("X 座標 : " + x);18. System.out.println("Y 座標 : " + y);19. System.out.println(" 圓半徑 : " + r);20. System.out.println(" 圓面積 : " + PI*r*r);21. }22.}

1. class Ch06_012. { public static void main(String [] args)3. {4. Circle0601 c = new Circle0601(5.0, 5.0, 8.0);5. c.area();6. System.out.println("PI 常數 : " +

AreaInterface0601.PI);7. System.out.println("PI 常數 ( 以物件方式 ): " +

c.PI); 8. }9. }

13

Page 14: Ch07  巢狀類別

介面也是物件的型別• 當物件所屬之類別在定義時實作某個介面,則此物件也「屬

於」該介面型別的物件。意即,介面也是物件的型別。• 若某個物件,其所屬之類別沒有實作介面,卻定義了介面宣

告的方法時,該物件還是不屬於介面型別。• 介面是物件的型別,所以介面也可以為陣列的基底型別,而

形成異質集合。

14

Page 15: Ch07  巢狀類別

介面的多重繼承• 介面和介面之間也可以有繼承的關係,而且可以有多重繼

承的關係• 不可以有靜態常數的重複繼承。如果不同父介面中定義了

同名的常數,則子介面型別的物件不可以使用該常數,以免發生曖昧不明的狀況

15

Page 16: Ch07  巢狀類別

範例 2: 介面的多重繼承(1/3)

CCE

CCF

<<interface>>

IIA<<interface>>

IIB

<<interface>>

IIC<<interface>>

IID

16

實線為繼承( extends),虛線為實作介面( implements)

Page 17: Ch07  巢狀類別

範例 2: 介面的多重繼承(2/3)• 請先練習一下功力

17

Page 18: Ch07  巢狀類別

範例 2: 介面的多重繼承(3/3)

• class Ch06_02{ public static void main(String [] args) { CCF a = new CCF(); a.m1(); a.m3(); a.m4(); a.m5(); }}abstract class CCE{ String name = "CCE"; abstract void m1(); void m2() { System.out.println(" 我在 CCE 的 m2 啦 !"); }}interface IIA{ String name = "IIA"; void m3(); void m5();}interface IIB{ String name = "IIB"; void m3();}interface IIC extends IIA, IIB{ String name = "IIC"; void m3();}interface IID { String name = "IID"; void m4();}

• class CCF extends CCE implements IIC, IID• {• String name = "CCF";• void m1()• {• System.out.println(" 我在 CCF 的 m1!");• m2();• }• public void m3()• {• System.out.println(" 我在 CCF 的 m3!");• }• public void m4()• {• System.out.println(" 我在 CCF 的 m4!");• }• public void m5()• {• System.out.println(" 我在 CCF 的 m5!");• }• } 請先練習一下功力

18

Page 19: Ch07  巢狀類別

介面 vs 抽象類別 (1/3)• 介面和抽象類別的相似之處:• 不能直接使用介面或抽象類別建立物件• 介面與抽象類別都可以宣告抽象方法。

19

Page 20: Ch07  巢狀類別

介面 vs 抽象類別 (2/3)• 介面( Interface )是在類別繼承架構中定義類別行為,內

含常數和方法宣告,但是並沒有實作程式碼,它和抽象類別的差異,如下所示:• 抽象類別的方法可能只有宣告,但是仍然可以擁有一般方法,

介面的方法都只有宣告,而且一定沒有實作的程式碼。• 介面不屬於類別的繼承架構,就算亳無關係的類別也一樣可

以實作同一個介面。• 類別只能繼承一個抽象類別,但是可以同時實作多個介面。

20

Page 21: Ch07  巢狀類別

介面 vs 抽象類別 (3/3)

• 介面和抽象類別的相異之處:• 介面內的方法皆為 public 和 abstract 方法。抽象類別

的抽象方法存取修飾字不限為 public 。• 介面內的屬性皆預設為 public 、 static 及 final 宣告,必

須指定其值。抽象類別中的屬性則沒有限定• 介面之間可以有多重繼承。抽象類別和其它類別之間只

能有單一繼承• 介面的目的是制訂整組訊息接收器的規格,模擬類別的

多重繼承。抽象類別的目的則是制訂部份物件的規格,並制訂部份訊息接收器的規格,為多型做準備

21

Page 22: Ch07  巢狀類別

大腦、小手動一動 (2)• 請設計兩種類別:• 珍珠奶茶• 奶茶珍珠

• 兩個物件分屬這兩類別

22