Presentation is loading. Please wait.

Presentation is loading. Please wait.

物件封裝 學習目標 瞭解封裝觀念與實現 定義類別、建構式與方法 使用方法重載與不定長度引數 瞭解static成員.

Similar presentations


Presentation on theme: "物件封裝 學習目標 瞭解封裝觀念與實現 定義類別、建構式與方法 使用方法重載與不定長度引數 瞭解static成員."— Presentation transcript:

1

2 物件封裝 學習目標 瞭解封裝觀念與實現 定義類別、建構式與方法 使用方法重載與不定長度引數 瞭解static成員

3 封裝物件初始流程 假設你要寫個可以管理儲值卡的應用程式 …

4 封裝物件初始流程 你的朋友要建立5張儲值卡的資料:

5 封裝物件初始流程 你發現到每次他在建立儲值卡物件時,都會作相同的初始動作 … 在程式中出現重複的流程,往往意謂著有改進的空間 …

6 封裝物件初始流程 可以定義建構式(Constructor)來改進這個問題:

7 封裝物件初始流程 在你重新編譯CashCard.java為CashCard.class之後,交給你的朋友 …

8 封裝物件初始流程 他應該會想寫哪個程式片段? 你封裝了什麼? 封裝物件初始化流程有什麼好處? 你用了建構式語法,實現物件初始化流程的封裝
拿到CashCard類別的使用者,不用重複撰寫物件初始化流程,事實上,他也不用知道物件如何初始化 就算你修改了建構式的內容,重新編譯並給予位元碼檔案之後,CashCard類別的使用者也無需修改程式

9 封裝物件操作流程 你的朋友使用CashCard建立3個物件,並要再對所有物件進行儲值的動作:

10

11 封裝物件操作流程 那些儲值的流程重複了 儲值應該是CashCard物件自己處理 可以定義方法(Method)來解決這個問題

12

13 封裝物件操作流程 使用CashCard的使用者,現在可以這麼撰寫了:

14 封裝物件操作流程 相較於先前得撰寫重複流程,CashCard使用者應該會比較想寫這個吧! 你封裝了什麼呢?
你封裝了儲值的流程。哪天你也許考慮每加值1000元就增加一點紅利,而不像現在就算加值5000元也只有一點紅利,就算改變了store()的流程,CashCard使用者也無需修改程式。

15 封裝物件內部資料 你「希望」使用者如下撰寫程式 …
你的希望完全就是一廂情願,因為CashCard使用者還是可以如下撰寫程式,跳過你的相關條件檢查:

16 封裝物件內部資料 你沒有封裝CashCard中不想讓使用者直接存取的私有資料, 如果有些資料是類別所私有,可以使用private關鍵字定義

17 封裝物件內部資料

18 封裝物件內部資料 編譯器會讓使用者在直接存取number、balance與bonus時編譯失敗:

19 封裝物件內部資料 如果沒辦法直接取得number、balance與bonus,那這段程式碼怎麼辦?

20 封裝物件內部資料 基於你的意願,CashCard類別上定義了getNumber()、getBalance()與getBonus()等取值方法

21 封裝物件內部資料 你封裝了什麼? 封裝了類別私有資料,讓使用者無法直接存取,而必須透過你提供的操作方法,經過你定義的流程才有可能存取私有資料
事實上,使用者也無從得知你的類別中有哪些私有資料,使用者不會知道物件的內部細節。

22 何謂封裝? 封裝目的主要就是隱藏物件細節,將物件當作黑箱進行操作。 使用者會呼叫建構式,但不知道建構式的細節
使用者會呼叫方法,但不知道方法的流程 使用者也不會知道有哪些私有資料 要操作物件,一律得透過你提供的方法呼叫

23 public權限修飾 假設現在為了管理需求,要將CashCard類別定義至cc.openhome.virtual套件中
除了原始碼與位元碼的資料夾需求必須符合套件階層之外,原始碼內容也得作些修改:

24 public權限修飾 你發現使用到CashCard的CardApp出錯了

25 public權限修飾 如果沒有宣告權限修飾的成員,只有在相同套件的類別程式碼中,才可以直接存取,也就是「套件範圍權限」
如果不同套件的類別程式碼中,想要直接存取,就會出現圖5.4的錯誤訊息 如果想在其它套件的類別程式碼中存取某套件的類別或物件成員,則該類別或物件成員必須是公開成員,要使用public加以宣告

26 public權限修飾

27 關於建構式 在定義類別時,可以使用建構式定義物件建立的初始流程 建構式是與類別名稱同名,無需宣告傳回型態的方法

28 關於建構式 如果你如下建立Some物件,成員a與text會初始兩次:

29 關於建構式 編譯器會在你沒有撰寫任何建構式時,自動加入預設建構式(Default constructor)
沒有撰寫任何建構式時,也可以如下以無引數方式呼叫建構式:

30 關於建構式 如果自行撰寫了建構式,編譯器就不會自動建立預設建構式
就只有一個具int參數的建構式,所以就不可以new Some()來建構物件,而必須使用new Some(1)的形式來建構物件

31 建構式與方法重載 建構物件時也許希望有對應的初始流程,可以定義多個建構式,只要參數型態或個數不同,這稱之為重載(Overload)建構式

32 建構時有兩種選擇,一是使用new Some(100)的方式,另一個是使用new Some(100, "some text")的方式

33 建構式與方法重載 定義方法時也可以進行重載,可為類似功能的方法提供統一名稱,但根據參數型態或個數的不同呼叫對應的方法

34 建構式與方法重載 方法重載讓程式設計人員不用苦惱方法名稱的設計,用一致名稱來呼叫類似功能的方法
方法重載可根據傳遞引數的型態不同,也可根據參數列個數的不同來設計方法重載

35 建構式與方法重載 返回值型態不可作為方法重載依據,以下方法重載並不正確:

36 建構式與方法重載 在JDK5之後使用方法重載時,要注意自動裝箱、拆箱問題

37 建構式與方法重載 編譯器在處理重載方法時,會依以下順序來處理: 還沒有裝箱動作前可符合引數個數與型態的方法。
裝箱動作後可符合引數個數與型態的方法。 嘗試有不定長度引數(稍後說明)並可符合引數型態的方法。 找不到合適的方法,編譯錯誤。

38 使用this 除了被宣告為static的地方外,this關鍵字可以出現在類別中任何地方

39 使用this 在建構式參數與物件資料成員同名時,可用this加以區別

40 使用this 在5.2.3看到過這個程式片段:

41 使用this 可以在建構式中呼叫另一個已定義的建構式

42 在建構物件之後、呼叫建構式之前,若有想執行的流程,可以使用{}定義

43 使用this 如果區域變數宣告了final,表示設值後就不能再變動 物件資料成員上也可以宣告final
程式中其它地方不能再有對x設值的動作,否則會編譯錯誤

44 使用this 那以下的程式片段呢? 如果物件資料成員被宣告為final,但沒有明確使用=指定值,那表示延遲物件成員值的指定

45 使用this 在建構式執行流程中,一定要有對該資料成員指定值的動作,否則編譯錯誤

46 使用this 如果改為以下就可以通過編譯:

47 static類別成員 建立了多個Ball物件,那每個Ball物件都會有自己的radius與PI成員

48 static類別成員 圓周率其實是個固定的常數,不用每個物件各自擁有,你可以在PI上宣告static,表示它屬於類別:

49 static類別成員 被宣告為static的成員,是將類別名稱作為名稱空間 也可以將宣告方法為static成員

50 static類別成員 被宣告為static的方法,也是將類別名稱作為名稱空間

51 static類別成員 Java程式設計領域,早就有許多良好命名慣例,沒有遵守慣例並不是錯,但會造成溝通與維護的麻煩

52 static類別成員 在大家都遵守命名慣例的情況下,看到首字大寫就知道它是類別,透過類別名稱與.運算子來存取,就會知道它是static成員
一直在用的System.out、System.in呢?

53 static類別成員 先前遇過的還有Integer.parseInt()、Long.parseLong()等剖析方法
在Java SE API中,只要想到與數學相關的功能,就會想到java.lang.Math,因為有許多以Math類別為名稱空間的常數與公用方法

54 static類別成員

55 static類別成員 因為都是static成員,所以你就可以這麼使用:

56 static類別成員 由於static成員是屬於類別,而非個別物件,所以在static成員中使用this,會是一種語意上的錯誤

57 static類別成員 如果你在程式碼中撰寫了某個物件資料成員,雖然沒有撰寫this,但也隱含了這個物件某成員的意思

58 static類別成員 static方法或區塊中,也不能呼叫非static方法或區塊

59 static類別成員 static方法或區塊中,可以使用static資料成員或方法成員

60 static類別成員 如果你有些動作,想在位元碼載入後執行,則可以定義static區塊

61 static類別成員 在JDK5之後,新增了import static語法

62 static類別成員 如果一個類別中有多個static成員想偷懶,也可以使用* 名稱衝突編譯器可透過以下順序來解析: 區域變數覆蓋 成員覆蓋
重載方法比對

63 static類別成員 如果編譯器無法判斷,則會回報錯誤

64 不定長度引數 若方法的引數個數事先無法決定該如何處理?

65 不定長度引數 在JDK5之後支援不定長度引數(Variable-length Argument)

66 不定長度引數 實際上不定長度引數是編譯器蜜糖

67 不定長度引數 System.out.println(MathTool.sum(1, 2, 3)),展開後也是變為陣列:

68 不定長度引數 使用不定長度引數時,方法上宣告的不定長度參數必須是參數列最後一個 使用兩個以上不定長度引數也是不合法的

69 內部類別 可以在類別中再定義類別,稱之為內部類別(Inner class)

70 內部類別 一個被宣告為static的內部類別,通常是將外部類別當作名稱空間
可以存取外部類別static成員,但不可存取外部類別非static成員

71 內部類別 方法中也可以宣告類別

72 內部類別 實務上比較少看到在方法中定義具名的內部類別,倒很常看到方法中定義匿名內部類別(Anonymous inner class)並直接實例化

73 傳值呼叫

74 傳值呼叫 如果由方法中傳回物件,並指定給變數,也是這種行為


Download ppt "物件封裝 學習目標 瞭解封裝觀念與實現 定義類別、建構式與方法 使用方法重載與不定長度引數 瞭解static成員."

Similar presentations


Ads by Google