第7章類與對象_第1頁
第7章類與對象_第2頁
第7章類與對象_第3頁
第7章類與對象_第4頁
第7章類與對象_第5頁
已閱讀5頁,還剩53頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、7-1 類與對象概述 類的聲明 與對象的使用 類成員的訪問控制 使用對象實例 靜態(tài)成員 對象實例的初始化:構(gòu)造方法 對象實例的收尾 第7章 類與對象 7-2 類:描述實體的抽象概念 成員:數(shù)據(jù)成員方法成員 數(shù)據(jù)成員:實體的屬性 方法成員:實體的行為 實體的約束只能隱式地表達在屬性或行為中。 對象:描述實體的具體個體 靜態(tài)的概念 動態(tài)的概念 7.1 類與對象概述 7-3 bertrand meyer:一個類是抽象數(shù)據(jù)類型的一個實現(xiàn)。 抽象(abstraction) 將復雜事物的一個或多個特性去掉,而只留意其他剩余特 性的行為或過程。 即將若干有區(qū)別的事物的共性抽取出來,并加以孤立地 考察的行為或

2、過程。 抽象數(shù)據(jù)類型(abstract data type) adt名字基調(diào)公理等式 基調(diào)類別集運算基調(diào)集 代數(shù)語義學以adt為主要研究對象。 抽象之處 未定義數(shù)據(jù)的具體表達方式; 未定義操作的具體實現(xiàn)方法。 抽象 7-4 adt class object 7-5 作為模塊化機制 封裝:將相關(guān)的數(shù)據(jù)以及作用在這些數(shù)據(jù)上的操作組織在一起。 信息隱藏:對象的某些特征只在對象內(nèi)部可見。 外部程序只能訪問那些允許它訪問的特征; 通常由訪問控制(access control)實現(xiàn)。 作為類型定義機制 類作為一種模板,用于創(chuàng)建對象實例。 提供相應的類型檢查。 類在程序中的作用 7-6 接口與實現(xiàn)的分離 同

3、一接口、多種實現(xiàn)。 omg idl:獨立于特定語言。 c+和java語言都支持接口與實現(xiàn)的分離 但兩種語言選擇的途徑不相同。 類的接口與實現(xiàn) 7-7 類:以保留字class聲明。 提供了對象的實現(xiàn)。 接口:以保留字interface聲明。 描述了對象的接口(對外的、公有的接口)。 由于缺乏實現(xiàn),不能通過接口創(chuàng)建對象實例(但允許將接口作為對象 的類型)。 類與接口的關(guān)系:類實現(xiàn)(implements)接口。 一個類可以實現(xiàn)多個接口:從不同角度看問題。 一個接口也可以由多個類實現(xiàn):不同的實現(xiàn)途徑。 但java語言的接口與類必須使用不同的名字! 7-8 數(shù)據(jù)成員 描述實體的屬性。 變量的聲明與初始化

4、 方法成員 描述實現(xiàn)的行為。 方法的聲明 7.2 類的聲明 7-9 / 銀行帳戶 account.java public class account / 銀行帳戶的屬性 private double balance = 0; / 存款余額 / 向帳戶中存款,存款金額為amount public void deposit(double amount) balance = balance + amount; / 從帳戶中取款amount元,成功返回true,否則返回false public boolean withdraw(double amount) if (amount = balance)

5、balance = balance - amount; return true; else return false; / 查詢帳戶的當前余額 public double getbalance() return balance; 例子一:銀行帳戶 7-10 / 利用account類實現(xiàn)銀行帳戶的管理 bank.java public class bank public static void main(string args) / 為張三開設(shè)一個帳戶 account zhang3 = new account(); / 張三的帳戶存入500元后又取出100元 zhang3.deposit(500

6、); if (!zhang3.withdraw(100) system.out.println(余額不足,取款失??!); / 為李四開設(shè)一個帳戶 account li4 = new account(); / 從張三的帳戶取出150元存入李四的帳戶 if (!zhang3.withdraw(150) system.out.println(余額不足,轉(zhuǎn)帳失??!); else li4.deposit(150); / 查詢張三和李四的帳戶余額 system.out.println(張三余額為 + zhang3.getbalance(); system.out.println(李四余額為 + li4.g

7、etbalance(); 使用account類 7-11 調(diào)用f 的子方法g 調(diào)用f 被調(diào)用的子方法f 調(diào)用f 第一次調(diào)用f的控制轉(zhuǎn)向 第二次調(diào)用f的控制轉(zhuǎn)向 非常適合以堆棧實現(xiàn) 子方法的調(diào)用與返回 7-12 對象zhang3類account的對象li4 公 用 區(qū) balance 250.00 deposit()代碼balance 150.00 withdraw()代碼 getbalance()代碼 7-13 雖然,張三和李四的deposit()代碼相同 public void deposit(double amount) this.balance = this.balance + amou

8、nt; 但是,張三和李四的余額屬性存放在不同存儲空間 zhang3.deposit(500)將500元累加到對象zhang3的余額 li4.deposit(500)將500元累加到對象li4的余額 對象狀態(tài):這是誰的錢? 7-14 / 庫存貨品 inventory.java public class inventory / 存貨的屬性 private double quantity = 0;/ 存貨的數(shù)量 private double amount = 0;/ 存貨的金額 / 驗收入庫,入庫數(shù)量和金額分別為qty和amt public void checkin(double qty, doub

9、le amt) quantity += qty; amount += amt; (未完待續(xù)) 例子二:庫存貨品 7-15 (續(xù)上頁) / 領(lǐng)料出庫,出庫數(shù)量為qty,返回出庫成本 public double checkout(double qty) / 如果數(shù)量余額不足則不作出庫 if (quantity qty) return 0; / 計算出庫的成本金額, double amt = amount; if (qty 0) this.x = x + get(); return true; else return false; public double get() double y = x *

10、 x; double x = y + 1; return x; set()中的x引用形式參數(shù)而不是 數(shù)據(jù)成員; get()第1行的x引用數(shù)據(jù)成員, 第3行的x引用局部變量。 name shadowing 因繼承屏蔽名 字稱為hiding 7-22 public 這些成員能由所有的類訪問。 protected 這 些 成 員 只 能 由 派 生 類 或 同 一 程 序 包 中 的 類 訪 問 。 對其他程序包的派生類而言,效果相當于public。 對其他程序包的非派生類而言,效果相當于private。 default 不加綴任何訪問控制保留字,又稱friendly access或package

11、access。 這些成員只能由同一程序包(包括默認程序包)中的類訪問。 對 本 程 序 包 的 類 而 言 , 效 果 相 當 于 p u b l i c 。 對其他程序包的類而言,效果相當于private。 private 這 些 成 員 是 除 自 身 外 任 何 類 都 不 允 許 訪 問 。 只有類自己的那些方法體中才可訪問這些成員。 開放性 不同于c+: c+沒有程序包 4p 7.3 類成員的訪問控制 7-23 缺省訪問控制 自java 1已開始支持。 較少用到的訪問控制方式。 注意:位于其他程序包的派生類也不可訪問這些成員。 即使在java api中也較少用到 例子:java.la

12、ng.string static int indexof(.) static int lastindexof(.) 目的:由string和stingbuffer共享該查找代碼。 結(jié)果:java.lang中的其他類均可調(diào)用該方法。 7-24 總體設(shè)計思想 盡可能保持私有性 只 要 能 滿 足 需 要 , 就 應 選 擇 開 放 性 最 低 的 訪 問 控 制 。 僅將你認為客戶程序需要使用的方法對外公開。 類成員訪問控制的編程模式 7-25 最簡單、實用的編程模式 將 所 有 數(shù) 據(jù) 成 員 聲 明 為 私 有 的 或 受 保 護 的 以實現(xiàn)信息隱藏。 將 所 有 方 法 成 員 聲 明 為 公

13、 有 的 以供其他程序片段使用。 7-26 真的需要對外暴露數(shù)據(jù)? 應仔細研究后再作出決策! 只讀公開: 仍聲明為私有的或受保護的;另提供一個公有的getter。 可讀寫公開: 要么 將數(shù)據(jù)成員聲明為公有的; 要么 將數(shù)據(jù)聲明為私有的或受保護的, 然后提供一個公有的getter和一個公有的setter。 7-27 類通常不執(zhí)行任何功能 而是由類創(chuàng)建的對象實例去完成某些功能。 類是一種類型定義機制 像創(chuàng)建基本類型變量那樣創(chuàng)建對象并初始化對象狀態(tài): int i = 0; 類是創(chuàng)建對象實例的模板(template)。 創(chuàng)建對象實現(xiàn) account zhang3 = new account(100);

14、 7.4 使用對象實例 7-28 new為對象分配存儲空間并初始化這些存儲空間 類是對象的模板,決定其存儲空間組織方式 存儲空間的組織 每一對象的數(shù)據(jù)成員占據(jù)不同內(nèi)存區(qū)域; 所有對象的方法成員共享同一段程序代碼。 復習:類決定了對象的內(nèi)部表示、取值范圍、可用操作! 深入了解對象狀態(tài) 7-29 聲明數(shù)據(jù)成員時初始化 / 銀行帳戶的屬性 private double balance = 0; / 存款余額 使用構(gòu)造方法構(gòu)造方法:一種特殊的方法成員 方法名與類名相同且無返回值(方法名與類名相同且無返回值(void也不行)。也不行)。 但允許像普通方法那樣定義一個形式參數(shù)表。但允許像普通方法那樣定義一

15、個形式參數(shù)表。 創(chuàng)建對象實例時會自動調(diào)用一次構(gòu)造方法初始化對象的狀態(tài)。創(chuàng)建對象實例時會自動調(diào)用一次構(gòu)造方法初始化對象的狀態(tài)。 程序員自己無法顯式地調(diào)用構(gòu)造方法 對象狀態(tài)的初始化 7-30 / 信用卡帳戶 public class creditcard / 信用卡帳戶的屬性 private double maxoverdraft;/ 透支限額 private double balance; / 存款余額 / 構(gòu)造方法,將透支限額maxoverdraft設(shè)置為max public creditcard(double max) system.out.println(“構(gòu)造方法:透支限額 “+max)

16、; maxoverdraft = max; if (max = 1000) balance = 100; else balance = 0; / 向帳戶中存款,存款金額為amount public void deposit(double amount) balance = balance + amount; / 從帳戶中取款amount元;取款成功返回true,否則返回false public boolean withdraw(double amount) if (amount = balance + maxoverdraft) balance = balance - amount; retu

17、rn true; else return false; / 查詢帳戶的當前余額 public double getbalance() return balance; 例 引 入 構(gòu) 造 方 法 7-31 / 利用creditcard類實現(xiàn)信用卡帳戶的管理 public class creditcarddemo public static void main(string args) / 為張三開設(shè)一個信用卡,允許最大透支限額為1000元 creditcard zhang3 = new creditcard(1000); / 張三的信用卡存入500元后又取出100元 zhang3.deposit

18、(500); if (!zhang3.withdraw(100) system.out.println(余額不足,取款失?。?; / 為李四開設(shè)一個信用卡,允許最大透支限額為500元 creditcard li4 = new creditcard(500); / 從張三的信用卡取出700元存入李四的信用卡 if (!zhang3.withdraw(700) system.out.println(余額不足,轉(zhuǎn)帳失??!); else li4.deposit(700); / 查詢張三和李四的信用卡余額 system.out.println(張三余額 + zhang3.getbalance(); sy

19、stem.out.println(李四余額 + li4.getbalance(); 7-32 對象zhang3 類creditcard的 對象li4 公 用 區(qū) maxoverdraft 1000.00 deposit()代碼 maxoverdraft 500.00 balance -200.00 withdraw()代碼 balance 700.00 getbalance()代碼 7-33 構(gòu)造方法:透支限額 1000.0 構(gòu)造方法:透支限額 500.0 張三余額 -200.0 李四余額 700.0 輸出結(jié)果: 7-34 定義靜態(tài)成員 static . 靜態(tài)數(shù)據(jù)成員靜態(tài)數(shù)據(jù)成員(類變量類變量

20、) 該屬性是類的屬性,而不是某一對象實例的屬性! 不管創(chuàng)建多少對象實例,該屬性只有一份(所有實例共享)。 靜態(tài)方法成員靜態(tài)方法成員(類方法類方法) 無須創(chuàng)建任何對象實例即可使用(例如java.lang.math類)。 直接以類名加小數(shù)點為前綴即可調(diào)用它們(math.random())。 方法體中只能引用靜態(tài)數(shù)據(jù)成員或調(diào)用靜態(tài)方法成員! 7.5 靜態(tài)成員 7-35 / 采用統(tǒng)一透支限額的信用卡帳戶 public class creditcard / 類屬性 private static double maxoverdraft = 1000; / 透支限額 / 實例屬性 private doubl

21、e balance = 0; / 存款余額 / 向帳戶中存款,存款金額為amount public void deposit(double amount) balance = balance + amount; / 從帳戶中取款amount元;取款成功返回true,否則返回false public boolean withdraw(double amount) if (amount = balance + maxoverdraft) balance = balance - amount; return true; else return false; / 查詢帳戶的當前余額 public do

22、uble getbalance() return balance; 類變量 7-36 對象zhang3 類creditcard的 對象li4 公 用 區(qū) balance -300.00 deposit()代碼 balance 700.00 withdraw()代碼 getbalance()代碼 maxoverdraft 1000.00 7-37 / 透支限額可浮動的信用卡帳戶管理 public class creditcard / 類屬性 private static double maxoverdraft = 1000; / 透支限額 / 實例屬性 private double balanc

23、e = 0; / 存款余額 / 將所有信用卡帳戶的透支限額設(shè)置為max public static void adjustoverdraft(double max) maxoverdraft = max; / 向帳戶中存款,存款金額為amount public void deposit(double amount) balance = balance + amount; / 從帳戶中取款,取款金額為amount;取款成功返回true,否則返回false public boolean withdraw(double amount) if (amount 0) matrix = new inti;

24、 / matrix有i個元素 elsematrix = new int10; / 缺省情況下,假設(shè)matrix有10個元素 matrix.java 7-55 / 輸入矩陣matrix的所有元素 public void input() system.out.println(請輸入矩陣元素:); int i = 0 ;/ 循環(huán)變量i(數(shù)組下標)初始化 while (i matrix.length) / 每次循環(huán)讀入第i個元素的值 system.out.print(n第+(i+1)+個元素是:); try bufferedreader in = new bufferedreader(new inputstreamreader(system.in); string inputline = in.readline(); matrixi = integer.valueof(inputline).intvalue(); catch (excep

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論