Presentation is loading. Please wait.

Presentation is loading. Please wait.

第6單元 6-1 類別的繼承 (Class Inheritance) 6-2 抽象類別 (Abstract Class)

Similar presentations


Presentation on theme: "第6單元 6-1 類別的繼承 (Class Inheritance) 6-2 抽象類別 (Abstract Class)"— Presentation transcript:

1 第6單元 6-1 類別的繼承 (Class Inheritance) 6-2 抽象類別 (Abstract Class) 6-3 介面 (Interface)

2 6- 類別的繼承 (Class Inheritance)
繼承是軟體再利用的一種技術,它允許設計者利用現成的類別發展出另一個類別。

3 6-1 類別的繼承 (Class Inheritance)
6-1-2 父類別(parent class、Super class、Base class)與子類別(child class、Sub class、Derived class)

4 6-1 類別的繼承 (Class Inheritance)
個人”和”學生”定義出兩個獨立分開的類別 將”學生”類別定義為”個人”的特別類別。換句話說,將”學生”類別繼承”個人”類別。

5 6-1 類別的繼承 (Class Inheritance)
6-1-3 子類別的產生

6 6-1 類別的繼承 (Class Inheritance)
子類別的產生 【步驟一】先找父類別 【步驟二】列出父類別的屬性 【步驟三】列出子類別的屬性 Property - Room, City, ID +getData():String +getID():String Apartment -floor, balcony +assessValue():double +getData():String

7 6-1 類別的繼承 (Class Inheritance)
【步驟四】建立類別的繼承關係 public class Apartment extends Property { private double balcony; private int floor; public Apartment(String identifer, String location, int rooms, double balcony, int floor){ } public double assessValue() { public String getData() { // 重新定義(Override)父類別的getData()函數

8 6-1 類別的繼承 (Class Inheritance)
6-1-4 繼承的實作 Implementation 設定存取識別 Access Modifier public class Apartment extends Property { private double balcony; private int floor; public Apartment(String identifer, String location, int rooms, double balcony, int floor){ } public double assessValue() { public String getData() { // 重新定義(Override)父類別的getData()函數

9 6-1 類別的繼承 (Class Inheritance)
在子類別中引用父類別的函數或變數 直接寫父類別的函數或變數名稱 public double assessValue(){ double value = Room * balcony *100 + floor * 5000; return value; } 如果子類別內的變數名稱或函數簽樣(signature)與父類別內的相同,就不可以直接寫該函數或變數名稱 public String getData() { String result = super.getData(); // 取得父類別的資料 result += "\nbalcony: " + balcony + "\nfloor: " + floor; // 父類別的資料+本身的資料 return result;

10 6-1 類別的繼承 (Class Inheritance)
在子類別中引用父類別的建構函數 由於子類別標題已定義了父類別的名稱,所以在引用父類別的建構函數時,不必再標示建構函數名稱,使用super保留字即可。 如果在子類別的函數中自行定義的變數名稱與類別的本身的成員變數名稱同名,在本身的成員變數名稱前加上this保留字。 public Apartment(String identifer, String location, int rooms, double balcony, int floor) { super(identifer, location, rooms); // 引用父類別的建構函數 this.balcony = balcony; // 左邊是類別的變數,右邊是函數的參數 this.floor = floor; // 左邊是類別的變數,右邊是函數的參數 }

11 6-1 類別的繼承 (Class Inheritance)
在子類別中重新定義(Override)父類別的函數 維持函數標頭不變,只是函數內的指令重寫。如子類別中的getData()函數就是重新定義父類別的getData()函數 子類別的使用: 當子類別的物件產生後,可以引用子類別及父類別內定義為public的函數及變數。 public static void main(String[] args) { Apartment property1 = new Apartment(" ", "Taipei", 6, 9, 5); property1.getID(); // 引用父類別的函數 System.out.println(property1.getData()); // 引用子類別的函數 System.out.println ("The assess value of this apartment is " property1.assessValue()); // 引用子類別的函數 }

12 6-1 類別的繼承 (Class Inheritance)
6-1-5 Object 類別 Object類別是Java程式中所有類別的父類別,只是這些類別並不需要特別聲明父類別是Object。也就是說宣告一個類別而沒有extends任何類別時,編譯器會為該類別補上extends Object。之前我們用了許多沒有經過實作的函數,就是Object類別內的函數。 Object類別的函數: clone() 是複製整個物件 MyClass obj2 = (MyClass) obj1.clone( ); equals() 是比較兩個物件是否相等 if (obj2.equals(obj1)) { }; toString() 是傳回一個代表該物件的字串 String rand = Double.toString(Math.random());

13 6-2抽象類別Abstract Method 上節談到的繼承是無條件的,被繼承者也可以設定有條件的繼承,也就是繼承者必須完成部份內容。
抽象函數是尚未定義(implement)的函數,也就是函數在宣告時使用abstract保留字,且不定義其內容,內容由繼承者完成。如: public abstract void methodA(); 通常以protected限制抽象函數必須被繼承 protected abstract void methodA();

14 6-2抽象類別Abstract Method 6-2-2 抽象類別 abstract class
一個類別裡若有抽象函數或父類別有抽象函數,該類別必須宣告成抽象類別,由於它的函數尚未定義完整,是不能用來生成物件instantiated。 對於一個沒有抽象函數的類別,如果想限制它不能生成物件,也可以設定為抽象類別,所以抽象函數不是抽象類別必要的條件。 抽象類別宣告也是使用abstract保留字。如: public abstract class property { // 定義抽象類別 protected abstract double assessValue(); // 未定義的函數

15 6-2抽象類別Abstract Method 6-2-3 抽象類別的使用 抽象類別只能被擴充,並於擴充時完成抽象函數的定義或重寫其中的函數:
抽象類別的使用 抽象類別只能被擴充,並於擴充時完成抽象函數的定義或重寫其中的函數: public class Apartment extends Property{ : public double assessValue() // 完成抽象函數的定義 { double value = Room * balcony *100 + floor * 5000; return value; }

16 6-3 介面 Interface 6-3-1 何謂介面(Interface)?
前節談到的是有條件的繼承,被繼承者只有部份函數未完成定義,現在談的是被繼承者所有的函數均未完成定義。 介面是一些相關函數的集合,所有這些函數只有標題沒有定義(implement),作用是規範子類別必須完成其中的內容。 public interface Insurable {     public int getPolicyNumber();     public int getCoverageAmount();     public double calculatePremium();     public Date getExpiryDate(); }

17 6-3 介面 Interface 6-3-2 介面的使用 public class Car implements Insurable {     public int getPolicyNumber() {        // 程式碼省略     }     public double calculatePremium() {        // 程式碼省略     }     public Date getExpiryDate() {        // 程式碼省略     }     public int getCoverageAmount() {        // 程式碼省略     } } 介面用來規範不同程式使用相同的函數名稱,如同樣是保費計算,不會發生有的叫calculatePremium(),有的叫CalculatePremium(),,有的叫PremiumCalculate ()。

18 6-3 介面 Interface 6-3-3 介面與抽象類別的差異
抽象類別內可能有一個或一個以上完全沒有實作(implement)的抽象函數。而介面裡面的函數則是全部沒有實作,雖然介面內的函數宣告不必加abstract關鍵字。 抽象類別用在部份已經成形的地方,如汽車已經有幾個固定的方法(如加油、煞車),但是還有幾個功能會因車子種類不同而不同(如引擎馬力、驅動方式)。 而介面則用在每種功能都會因類別不同而不同的地方。如偵測滑鼠動作係根據不同的事件(event)做反應,同一事件不同程式會有不同反應,所以將偵測滑鼠動作MouseListener設計成介面。 介面與抽象類別一樣不能被用來生成物件(instantiated) ,如 new Insurable(); 是不被許可的。

19 6-3 介面 Interface 6-3-4 介面與繼承的差異
1. 在繼承中,合用的可以完全留用,不合用的可以重寫(Override)。在介面中,就必須完全自力救濟了,因為它只提供一個空架子。 2. 子類別只能繼承一個父類別(C++可以繼承多個類別),但可以使用好幾個介面。 3. 繼承與介面可以同時使用,如: public class Vegetable extends Food  implements  EdibleObject, ThrowableObject, CookableObject{     : }

20 6-3 介面 Interface 6-3-5 何謂多型 Polymorphism?
多型是抽象類別與介面的一種應用觀念,就像封裝Encapsulation是一般類別的應用觀念一樣,並不是新的架構或實體。 當許多類別引用同一個抽象類別或介面時,每個類別一定會對抽象類別或介面內未完成的函數予以實作,一般而言某一函數被各類別實作後,內容會各自有不同,這種相同函數名稱不同函數內容的用法就是多型Polymorphism的意思。


Download ppt "第6單元 6-1 類別的繼承 (Class Inheritance) 6-2 抽象類別 (Abstract Class)"

Similar presentations


Ads by Google