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

Slides:



Advertisements
Similar presentations
第一單元 建立java 程式.
Advertisements

大葉大學 指導教授: 黃鈴玲 學生: 林慶南(工業工程與科技管理所)
認識倍數(一) 設計者:建功國小 盧建宏.
陳維魁 博士 儒林圖書公司 第九章 資料抽象化 陳維魁 博士 儒林圖書公司.
11 繼承類別 11.4 建立者與破壞者 單一建立者與破壞者 11-20
C++入門 以Dev C++為例.
程式語言的基礎 Input Output Program 世代 程式語言 第一世代 Machine language 第二世代
程式設計概論 1.1 程式設計概論 程式語言的演進 物件導向程式 程式開發流程 1.2 C++開發工具
LINQ 建國科技大學 資管系 饒瑞佶.
Java簡介.
Visual C++ introduction
簡易C++除錯技巧 長庚大學機械系
JAVA 程式設計與資料結構 第七章 繼承與Interface.
JDK 安裝教學 (for Win7) Soochow University
101北一女中 資訊選手培訓營 妳不可不了解的指標 Nan.
方法.
在NS-2上模擬多個FTP連線,觀察頻寬的變化
類別(class) 類別class與物件object.
SQL Stored Procedure SQL 預存程序.
R教學 安裝RStudio 羅琪老師.
安裝JDK 安裝Eclipse Eclipse 中文化
Methods 靜宜大學資工系 蔡奇偉副教授 ©2011.
程式設計(二) 進階類別 郭文真 Sabrina Kuo.
Dialog Programming What is Dialog Programming? 新增Screen與設定Attributes
Java 程式設計 講師:FrankLin.
IP, Port, Router and Port forward
JAVA 程式設計與資料結構 第四章 陣列、字串與數學物件.
|12 結構與列舉型態.
Topic Introduction—RMI
第一單元 建立java 程式.
Ch20. 計算器 (Mac 版本).
第 19 章 XML記憶體執行模式.
|07 函數.
精彩Java 2程式設計 <吳逸賢、吳目誠 編著>
網頁資料知多少? 事 實 ? 謠言?.
C++: 物件導向程式設計-使用類別(Class)
CH05. 選擇敘述.
GUI Title and GUI Status
微積分網路教學課程 應用統計學系 周 章.
挑戰C++程式語言 ──第8章 進一步談字元與字串
LINQ資料查詢技術.
Class & Object 靜宜大學資工系 蔡奇偉副教授 ©2011.
樣版.
DRC with Calibre 課程名稱:VLSI 報告人:黃家洋 日期: 改版(蔡秉均) 1.
Dialog Programming What is Dialog Programming? 新增Screen與設定Attributes
Video 影像 (VideoPlayer 影像播放器、Camcorder 錄影機) 靜宜大學資管系 楊子青
流程控制:Switch-Case 94學年度第一學期‧資訊教育 東海大學物理系.
OOP9 類別Class.
MiRanda Java Interface v1.0的使用方法
陣列與結構.
12 虛擬函數 12.1 多載與超載 12-2 多載函數 12-2 超載函數 虛擬函數 12-6 同名異式 12-7
北一女中 資訊選手培訓營 妳不可不了解的指標 Nan.
進階UI元件:ListView元件以及複選 靜宜大學資管系 楊子青
1757: Secret Chamber at Mount Rushmore
第四章 陣列、指標與參考 4-1 物件陣列 4-2 使用物件指標 4-3 this指標 4-4 new 與 delete
JAVA 程式設計與資料結構 第三章 物件的設計.
What is “this”? 在物件導向程式設計中,類別的定義就是在說明如果創建了“這個物件”的話,它會具有那些屬性與功能,以及這些功能是如何實現的。 而所謂的“這個物件”就以 this 來表示。 當我們在JavaScript與jQuery中寫 script 程式(函式)時,“誰”呼叫這個函式,這個“誰”就是該函式中所謂的.
作業系統實習課(二) -Scheduler-Related System Calls-
對於成員(member)存取權的限制 成員的資料被毫無限制的存取,任誰都可以指定任意值給成員,Java語言為了防止這種現象的產生,規定:有一種成員的資料不能任由類別外部的任何人隨意存取。
多國語系 建國科技大學 資管系 饒瑞佶.
開發Java程式語言的工具 JDK.
String類別 在C語言中提供兩種支援字串的方式 可以使用傳統以null結尾的字元陣列 使用string類別
Chapter 4 Multi-Threads (多執行緒).
C語言程式設計 老師:謝孟諺 助教:楊斯竣.
13 繼承類別 13.1 繼承概論 基礎類別與衍生類別 繼承型式 13-2
Develop and Build Drives by Visual C++ IDE
第五章 例外處理(Exception Handling)與Package
JUDGE GIRL 使用介紹 & 常見問題 TAs :
方法(Method) 函數.
InputStreamReader Console Scanner
Presentation transcript:

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

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

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

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

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

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

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

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

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

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

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

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

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

封裝物件內部資料

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

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

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

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

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

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

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

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

public權限修飾

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

static類別成員

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

傳值呼叫

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