課程講義

Download Report

Transcript 課程講義

第7章 物件導向進階觀念
7-1 Java套件
7-2 編譯Java專案套件
7-3 存取修飾詞的使用
7-4 封裝
7-5 抽象類別
7-6 介面
7-7 Java的繼承與實作
7-8 物件的轉型
7-9 多型
第7章 物件導向進階觀念 - 2
7-1 Java套件
套件(Package)其實就是檔案系統中的目錄,如
果要使用套件,首先會建立專案套件,然後在專案
套件內依功能建立子套件,最後在各個子套件內建
立Java檔,編譯之後會產生對應的類別檔。
第7章 物件導向進階觀念 - 3
package關鍵字的使用
使用套件功能時,需要使用package關鍵字再加上該
類別檔所在的「內部路徑」,所謂內部路徑就是專
案套件至該類別檔所在目錄的路徑。
第7章 物件導向進階觀念 - 4
import關鍵字的使用
一個類別使用到其他類別內容,如果它們都在不同的套件內,
就要使用import關鍵字來標示被匯入類別的內部路徑與該類別
名稱;如果在相同套件內,就import語法則可省略。
第7章 物件導向進階觀念 - 5
java.lang套件
Java會自動匯入「java.lang」套件內的任一類別(但
不包含子套件內類別),所以如果程式設計師使用到
「java.lang」套件內的類別,可以不用再寫import匯
入式。
第7章 物件導向進階觀念 - 6
7-2 編譯Java專案套件
編譯專案套件
假設Execute.java檔案的路徑是:C:/books/execute/Execute.java
編譯:
C:\>javac books/execute/Execute.java
執行:
C:\>java books.execute.Execute
第7章 物件導向進階觀念 - 7
指定類別檔的存放目錄
如果想要在編譯過程中同時指定編譯好的類別檔所存放的目錄,可以
加上「-d」參數,但要注意,欲存放的目錄必須先建立好。
編譯:
C:\>javac -d classes books/Book.java
第7章 物件導向進階觀念 - 8
classpath的設定
一個類別使用到其他類別內容,如果它們都在不同的專案套件內,
除了使用import關鍵字來標示內部路徑外,在編譯時還需要使用cp (-classpath)來標示外部路徑。
編譯:
C:\cpExample>javac -cp c:/cpExample/lib hua/Execute.java
執行:
C:\cpExample>java -cp c:/cpExample/lib;. hua.Execute
第7章 物件導向進階觀念 - 9
JAR檔的使用
JAR檔(Java Archive)就是以ZIP格式壓縮而成的檔案,將套件壓縮成JAR
檔是為了方便攜帶或傳輸。使用JAR檔時,必須連同JAR檔名稱也要列出。
編譯:
C:\cpExample>javac -cp c:/cpExample/lib/ming.jar hua/Execute.java
執行:
C:\cpExample>java -cp c:/cpExample/lib/ming.jar;. hua.Execute
第7章 物件導向進階觀念 - 10
7-3 存取修飾詞的使用
存取修飾詞開放程度
存取修飾詞共有4種,依照開放程度高到低,依序為:
public、protected、default、private。
第7章 物件導向進階觀念 - 11
public修飾詞
冠上public的類別、方法、屬性,能讓其他外部類別存取而
沒有任何限制。
第7章 物件導向進階觀念 - 12
protected修飾詞
protected成員只可被相同套件的類別存取,或是子類別物件
存取。而且子類別方法可以改寫父類別的protected方法。
第7章 物件導向進階觀念 - 13
default修飾詞
類別或類別的成員沒有冠上任何存取修飾詞,就
代表使用了default修飾詞。default的類別或成員,
只可被相同套件的類別存取。
第7章 物件導向進階觀念 - 14
private修飾詞
private的限制最嚴格,成員一旦冠上private,就完全
不開放給其他類別存取,而只能在所在類別內存取。
第7章 物件導向進階觀念 - 15
注意:
如果類別設定成default,即使該類別內的成員都設定成
public,不同套件的類別也無法存取。
第7章 物件導向進階觀念 - 16
7-4 封裝
封裝的步驟
將屬性以private修飾詞封住,不讓外部類別隨意存取。
撰寫setter和getter方法,並設定成public,可讓外部類
別透過這2個方法來存取private屬性。
第7章 物件導向進階觀念 - 17
範例:encap專案
輸出結果
定價設定錯誤,不可為-500.0
書的定價 = 500.0
範例說明
• 第6行:無法直接存取,因為
price屬性為private。
• 第7行: -500.0不是合法的值,
所以設定失敗。
• 第8行:500.0是合法的值,所
以設定成功。
• 第9行:得到price屬性值。
第7章 物件導向進階觀念 - 18
7-5 抽象類別
抽象類別
如果類別內有抽象方法,該類別就必須定義為抽象類別,
也就是要冠上abstract修飾詞。
abstract class Book{ //有抽象方法的類別必須定義成抽象類別
public double getPrice(){ //一般方法都有大括號
return price;
}
abstract public void show(); //抽象方法沒有大括號,直接以「;」結束
}
注意:
abstract與final修飾詞不可共存。
abstract與private修飾詞不可共存。
第7章 物件導向進階觀念 - 19
抽象類別的規則
1. 抽象類別本身無法實體化。
2. 子類別要實作抽象方法,否則也必須定義成抽象類別。
第7章 物件導向進階觀念 - 20
輸出結果
書名:Java程式設計
定價:580.0
作者:張搧風
附光碟? true
範例說明
• 第20行:必須實作第10行抽象
show()方法。
• 第30行:Book是抽象類別,本
身不能實體化。
第7章 物件導向進階觀念 - 21
7-6 介面
介面內全都是抽象方法,有6個重要的規則:
1. 介面的方法會自動加上abstract和public修飾詞。
2. 介面本身無法實體化。
3. 子類別要實作父介面的抽象方法,否則也必須定義成抽
象類別。
4. 子介面只可繼承父介面。
5. 介面的屬性會自動加上final和public修飾詞。
6. 介面沒有建構式。
第7章 物件導向進階觀念 - 22
輸出結果
書名:Java程式設計
定價:580.0
作者:張搧風
附光碟? true
範例說明
• 第17行:必須實作第2行抽象
show()方法,而且必須冠上
public。
• 第27行:Book是介面,本身不
能實體化。
第7章 物件導向進階觀念 - 23
7-7 Java的繼承與實作
1個類別不可繼承2個以上類別;但1個類別可實作2個以上
介面,或1個介面繼承多個介面,舉例如下:
1. 1個類別只可繼承1個類別。
2. 1個類別可實作多個介面。
3. 任何類別都只可實作介面,而不可繼承介面,。
4. 1個介面可繼承多個介面。
5. 任何介面都不可繼承類別,因為會將一般方法繼承
過來,而介面只可有抽象方法。
6. 任何介面都不可實作介面,因為實作就必須建立一
般方法,而介面只可有抽象方法。
第7章 物件導向進階觀念 - 24
7-8 物件的轉型
//基本類型轉型
int i = 1;
double d = i;
int j = (int)d;
//物件轉型
class Book{}
class ComputerBook extends Book{}
class ComicBook extends Book{}
class Execute{
public static void main(String[] args){
ComputerBook cmpBook1 = new ComputerBook();
Book book = cmpBook1;
ComputerBook cmpBook2 = (ComputerBook)book;
//產生ClassCastException
ComicBook cmiBook = (ComicBook)book;
}
}
第7章 物件導向進階觀念 - 25
輸出結果
電腦書資訊
隨書光碟資訊
範例說明
• 第14行:自動轉型成Book類型並存入book1。
• 第15行:呼叫第5行show()方法。
• 第16行:編譯器認為book1是Book類型,而Book類別沒有定義cdInfo()方法,所以會編譯失敗。
• 第17行:將book1轉回ComputerBook類型後呼叫cdInfo()方法。
• 第18行:book1實際是ComputerBook類型,轉型成ComicBook,產生ClassCastException例外事件。
• 第20行:book2實際是Book類型,轉型成ComicBook,產生ClassCastException例外事件。
第7章 物件導向進階觀念 - 26
instanceof 運算符號
instanceof運算符號可以用來檢查1個物件實體
(instance)是否屬於指定類型,與「is a」觀念相同。
第7章 物件導向進階觀念 - 27
輸出結果
book2 is-a paper
book2 is-a Book
book2 is-a ComputerBook
book3 is-a ComputerBook
範例說明
• 第11行:book1不屬於
ComputerBook類型。
• 第14行:book2屬於paper類型。
• 第17行:book2屬於Book類型。
• 第20行:book2的實體就是
ComputerBook類型。
• 第23行:book3的實體就是
ComputerBook類型。
• 第27行:編譯失敗。
第7章 物件導向進階觀念 - 28
7-9 多型
所謂多型就是執行時會依據物件實體類型來呼叫對
應的方法,為了要達到這個目的,子類別必須先改
寫父類別的方法。使用多型就是為了避免轉型上的
麻煩與可能發生的錯誤。
第7章 物件導向進階觀念 - 29
輸出結果
書籍總金額 = 852.0
範例說明
• 第4、8、12行:多型的第1要件就是子類別改寫其父類別對應的方法。
• 第22行:依據book所屬類型,呼叫Book、ComputerBook、ComicBook對應的getPrice()方法。