java面向?qū)ο蟾呒?ppt_第1頁
java面向?qū)ο蟾呒?ppt_第2頁
java面向?qū)ο蟾呒?ppt_第3頁
java面向?qū)ο蟾呒?ppt_第4頁
java面向?qū)ο蟾呒?ppt_第5頁
已閱讀5頁,還剩48頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、面向?qū)ο蟮母呒壋绦蛟O計,伍淳華 北京郵電大學計算機學院,Java,2INTRODUCTION-1,面向?qū)ο蟾呒壋绦蛟O計,繼承object類,所有類都是Object的子類; Object obj=new BackAccount(); Object obj=new String(“Hello”);,Java,3INTRODUCTION-1,面向?qū)ο蟾呒壋绦蛟O計,繼承object類,equals方法 toString方法 clone方法 在自己編寫的類中,最好重寫這些方法!,Java,4INTRODUCTION-1,面向?qū)ο蟾呒壋绦蛟O計,繼承object類,equals方法 public boole

2、an equals(Object obj) return (this = obj); 判斷兩個對象是否具有相同的引用,Java,5INTRODUCTION-1,面向?qū)ο蟾呒壋绦蛟O計,繼承object類,equals方法 class BankAccount public boolean equals(Object obj) BankAccount other=(BankAccount)obj; return (accountNumber=other.accountNumber if(obj=null) return false; if(getClass()!=obj.getClass() ret

3、urn false; BankAccount other=(BankAccount)obj; return (accountNumber=other.accountNumber SavingAccount other=obj; return /比較SavingAccount中的成員變量 ,Java,9INTRODUCTION-1,面向?qū)ο蟾呒壋绦蛟O計,繼承object類,Java語言規(guī)范要求equals方法具有下面的特性 1)自反性:對于任何非空引用x,x.equals(x)應該返回true; 2)對稱性:對于任何引用x和y,如果x.equals(y)返回true,那么y.equals(x)也

4、應該返回true; 3)傳遞性:對于任何引用x,y,z,如果x.equals(y)返回true,y.equals(z)返回true,那么x.equals(z)也應該返回true; 4)一致性:如果x和y引用的對象沒有發(fā)生變化,那么反復調(diào)用x.equals(y)應該返回同樣的結果; 5)對于任意非空引用x,x.equals(null)應該返回false;,Java,10INTRODUCTION-1,面向?qū)ο蟾呒壋绦蛟O計,繼承object類,注意: class BankAccount public boolean equals(BankAccount obj) if(this=obj) retur

5、n true; if(obj=null) return false; if(getClass()!=obj.getClass() return false; return (accountNumber=obj.accountNumber if(obj=null) return false; if(!(obj instanceof BankAccount) return false; BankAccout other=(BankAccount) obj; return (accountNumber=other.accountNumber 如果由超類決定相等的概念,則可以使用instanceof進

6、行檢測,這樣可以在不同子類的對象之間進行相等的比較.,Java,13INTRODUCTION-1,面向?qū)ο蟾呒壋绦蛟O計,繼承object類,hashCode方法 hasCode方法返回一個整型數(shù)值,并合理地組合實例域的散列碼,以便能夠讓各個不同的對象產(chǎn)生的散列碼更加均勻; 如果x.equals(y)返回true,那么x.hashCode()就必須與y.hashCode()具有相同的值; 如果重新定義equals方法,就必須重新定義hashCde方法; Object類的hashCode()方法返回對象的存儲地址;,Java,14INTRODUCTION-1,面向?qū)ο蟾呒壋绦蛟O計,繼承object

7、類,hashCode方法 class BankAccount public int hashCode() return 7*Integer(accountNumber).hashCode() +11*Double(balance).hashCode(); ,Java,15INTRODUCTION-1,面向?qū)ο蟾呒壋绦蛟O計,繼承object類,toString方法 返回對象的字符串表示; Object類中默認返回對象所屬的類名和散列碼. System.out.println(System.out); 輸出:java.io.PrintStreama90653,Java,16INTRODUCTION

8、-1,面向?qū)ο蟾呒壋绦蛟O計,繼承object類,toString方法 重寫toString方法一般遵循的格式為: 類名成員變量值 java.awt.Pointx=20,y=20 BankAccout中的toString函數(shù)可改寫為: public String toString() retrun “BankAccoutbalance=“+balance+ ”,accountNumber=“+accountNumber+”; ,Java,17INTRODUCTION-1,面向?qū)ο蟾呒壋绦蛟O計,繼承object類,toString方法 public String toString() retrun

9、 getClass.getName()+”balance=“+balance+”,accountNumber=“+accountNumber+”; ,Java,18INTRODUCTION-1,面向?qū)ο蟾呒壋绦蛟O計,繼承object類,toString方法 class SavingAccount extends BankAccount public String toString() retrun super.toString()+”interest=“+interest+”; ,Java,19INTRODUCTION-1,面向?qū)ο蟾呒壋绦蛟O計,接口,接口代碼重用 Eg : DataSet,J

10、ava,20INTRODUCTION-1,面向?qū)ο蟾呒壋绦蛟O計,接口,接口代碼重用 如果想計算一組BankAccount對象中余額的最大值和平均值?,Java,21INTRODUCTION-1,面向?qū)ο蟾呒壋绦蛟O計,接口,接口代碼重用 public class DataSet . . . public void add(BankAccount x) sum = sum + x.getBalance(); if (count = 0 | maximum.getBalance() x.getBalance() maximum = x; count+; public BankAccount getM

11、aximum() return maximum; private double sum; private BankAccount maximum; private int count; ,Java,22INTRODUCTION-1,面向?qū)ο蟾呒壋绦蛟O計,接口,接口代碼重用 public class DataSet . . . public void add(Student x) sum = sum + x.getScore(); if (count = 0 | maximum.getScore() x.getBalance() maximum = x; count+; public Stude

12、nt getMaximum() return maximum; private double sum; private Student maximum; private int count; ,Java,23INTRODUCTION-1,面向?qū)ο蟾呒壋绦蛟O計,接口,接口代碼重用 X的數(shù)據(jù)類型; 如果每個對象實現(xiàn)一個getMeasure方法來提供測量的內(nèi)容,就可實現(xiàn)一個可重用的DataSet,以add()方法為例: sum = sum + x.getMeasure(); if (count = 0 | maximum.getMeasure() x.getMeasure() maximum = x

13、; count+; X的數(shù)據(jù)類型應該是什么? -X的數(shù)據(jù)類型可以是任意實現(xiàn)了getMeasure( )的類。,Java,24INTRODUCTION-1,面向?qū)ο蟾呒壋绦蛟O計,接口,接口代碼重用 接口可用來規(guī)范類的行為 public interface Measurable double getMeasure(); DataSet可以返回一組對象中值最大的那個對象,并計算出這一組對象的平均值,但要求對象所屬的類必須實現(xiàn)了Measurable接口。,Java,25INTRODUCTION-1,面向?qū)ο蟾呒壋绦蛟O計,接口,接口代碼重用 接口可用來規(guī)范類的行為 public interface Me

14、asurable double getMeasure(); DataSet可以返回一組對象中值最大的那個對象,并計算出這一組對象的平均值,但要求對象所屬的類必須實現(xiàn)了Measurable接口。,Java,26INTRODUCTION-1,面向?qū)ο蟾呒壋绦蛟O計,接口,public class DataSet . . . public void add(Measurable x) sum = sum + x.getMeasure(); if (count = 0 | maximum.getMeasure() x.getMeasure() maximum = x; count+; public Me

15、asurable getMaximum() return maximum; private double sum; private Measurable maximum; private int count; ,Java,27INTRODUCTION-1,面向?qū)ο蟾呒壋绦蛟O計,接口,接口VS 類 接口中所有的方法都是抽象的,即有方法名,方法參數(shù),返回值,但沒有方法體; 接口中的方法的訪問限制權限都是public; 接口中沒有成員變量,但可以有常量;,Java,28INTRODUCTION-1,面向?qū)ο蟾呒壋绦蛟O計,接口,實現(xiàn)接口 用關鍵詞implements來標識一個類實現(xiàn)了某個接口; pub

16、lic class BankAccount implements Measurable public double getMeasure() return balance; / Additional methods and fields 類可以實現(xiàn)多個接口; -類必須完成其實現(xiàn)的所有接口中的所有方法;,Java,29INTRODUCTION-1,面向?qū)ο蟾呒壋绦蛟O計,接口,接口使得類和類之間的藕合度減少; Eg: DataSet、BankAccount和Student的UML圖 -矩形框表示一個類,矩形框中如果有interface表示一個接口; -虛線加上一個空的三角形箭頭表示”is-a”關系

17、; -虛線加上一個箭頭表示”uses”關系;,Java,30INTRODUCTION-1,面向?qū)ο蟾呒壋绦蛟O計,接口,使用接口前的UML圖,Java,31INTRODUCTION-1,面向?qū)ο蟾呒壋绦蛟O計,接口,使用接口后的UML圖,Java,32INTRODUCTION-1,面向?qū)ο蟾呒壋绦蛟O計,接口,接口定義語法 public interface InterfaceName / method signatures Example: public interface Measurable double getMeasure(); 注:接口中的方法體自動為public,Java,33INTRO

18、DUCTION-1,面向?qū)ο蟾呒壋绦蛟O計,接口,類實現(xiàn)接口語法 public class ClassName implements InterfaceName, InterfaceName, . / methods / instance variables Example: public class BankAccount implements Measurable / Other BankAccount methods public double getMeasure() / Method implementation ,Java,34INTRODUCTION-1,面向?qū)ο蟾呒壋绦蛟O計,接口

19、,如果想用DataSet類返回一組Country對象中人口最多的一個對象,Country類應該滿足什么條件? 可否將DataSet類的 public void add(Measurable x)方法的參數(shù)類型改為Object?,Java,35INTRODUCTION-1,面向?qū)ο蟾呒壋绦蛟O計,接口,接口和類的互換 DataSet bankData=new DataSet(); bankData.add(new BankAccount(1100); public void add(Measurable x) 如果一個類實現(xiàn)了某個接口,則將該類轉(zhuǎn)換為該接口是正確的,而且不需要強制轉(zhuǎn)換;,Java,

20、36INTRODUCTION-1,面向?qū)ο蟾呒壋绦蛟O計,接口,接口和類的互換 DataSet bankData=new DataSet(); bankData.add(new BankAccount(1100); bankData.add(new BankAccount(2100); bankData.add(new BankAccount(2100); Measurable m=bankData.getMaxium(); m.deposit(3000); /上面的語句是非法的,Java,37INTRODUCTION-1,面向?qū)ο蟾呒壋绦蛟O計,接口,接口和類的互換 接口轉(zhuǎn)換為某個實現(xiàn)了該接口的

21、類,需要用強制轉(zhuǎn)換 BankAccount m=(BankAccout)bankData.getMaxium(); m.deposit(3000);,Java,38INTRODUCTION-1,面向?qū)ο蟾呒壋绦蛟O計,接口,接口與多態(tài) 接口不能實例化 Measurable m=new Measuable(); /wrong! 一個對象只能是實現(xiàn)了該接口的某個類的實例 Measurable x;x = new BankAccount(10000);x = new Studnet( “Jack); 調(diào)用對象的方法 x.getMeasure(); ?調(diào)用了哪個方法,Java,39INTRODUCTIO

22、N-1,面向?qū)ο蟾呒壋绦蛟O計,接口,接口與多態(tài) 接口可實現(xiàn)運行時的多態(tài),在運行階段,由對象的實際類型決定調(diào)用哪一個具體的方法 -如果x是一個BankAccount對象,則調(diào)用BankAccount.getMeasure(); -如果x是一個Student對象,則調(diào)用Student.getMeasure();,Java,40INTRODUCTION-1,面向?qū)ο蟾呒壋绦蛟O計,接口,接口與回調(diào)(callback) Measurable接口的限制 -只能對用戶自己編寫的類實現(xiàn)該接口,不適用系統(tǒng)自帶的類 -測量形式比較簡單。 回調(diào):一種常見的程序設計模式??梢灾赋瞿硞€特定事件發(fā)生時應該采取的動作。 改

23、寫Measurable -在前面的DataSet實現(xiàn)中,測量的實現(xiàn)依賴于調(diào)用該方法的對象; -改進:將需要測量的對象傳遞給一個測量方法: public interface Measurer double measure(Object anObject); ,Java,41INTRODUCTION-1,class DataSet private double sum; private Object maximum; private int count; private Measurer measurer;/添加測量器對象 ,Java,42INTRODUCTION-1,面向?qū)ο蟾呒壋绦蛟O計,接口,

24、修改后的add() 方法 public void add(Object x) sum = sum + measurer.measure(x); if (count = 0 | measurer.measure(maximum) measurer.measure(x) maximum = x; count+; ,Java,43INTRODUCTION-1,面向?qū)ο蟾呒壋绦蛟O計,接口,可以定義一個測量器對相關類的對象進行任何形式的測量 public class RectangleMeasurer implements Measurer public double measure(Object an

25、Object) Rectangle aRectangle = (Rectangle) anObject; double area = aRectangle.getWidth() * aRectangle.getHeight(); return area; (rectangle是系統(tǒng)自帶的類,表示一個矩形) ,Java,44INTRODUCTION-1,面向?qū)ο蟾呒壋绦蛟O計,接口,將測量器傳給一個DataSet對象 Measurer m = new RectangleMeasurer(); DataSet data = new DataSet(m);data.add(new Rectangle(

26、5, 10, 20, 30);data.add(new Rectangle(10, 20, 30, 40);System.out.println(“Average area=” + data.getAverage(); Rectangle max= (Rectangle)data.gatMaximum(); System.out.println(“Maximum area rectangle=”+max);,Java,45INTRODUCTION-1,面向?qū)ο蟾呒壋绦蛟O計,接口,(在面向?qū)ο笤O計時,需要降低類與類之間的耦合性),Java,46INTRODUCTION-1,面向?qū)ο蟾呒壋绦蛟O計,接口,示例程序1 DataSetTest,Java,47INTRODUCTION-1,面向?qū)ο蟾呒壋绦蛟O計,內(nèi)部類,對于一些用途很有限的類,可將其放在要使用的方法內(nèi); public class DataSetTester public static void main(Stri

溫馨提示

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

評論

0/150

提交評論