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

下載本文檔

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

文檔簡(jiǎn)介

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

2、an equals(Object obj) return (this = obj); 判斷兩個(gè)對(duì)象是否具有相同的引用,Java,5INTRODUCTION-1,面向?qū)ο蟾呒?jí)程序設(shè)計(jì),繼承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ū)ο蟾呒?jí)程序設(shè)計(jì),繼承object類,Java語(yǔ)言規(guī)范要求equals方法具有下面的特性 1)自反性:對(duì)于任何非空引用x,x.equals(x)應(yīng)該返回true; 2)對(duì)稱性:對(duì)于任何引用x和y,如果x.equals(y)返回true,那么y.equals(x)也

4、應(yīng)該返回true; 3)傳遞性:對(duì)于任何引用x,y,z,如果x.equals(y)返回true,y.equals(z)返回true,那么x.equals(z)也應(yīng)該返回true; 4)一致性:如果x和y引用的對(duì)象沒(méi)有發(fā)生變化,那么反復(fù)調(diào)用x.equals(y)應(yīng)該返回同樣的結(jié)果; 5)對(duì)于任意非空引用x,x.equals(null)應(yīng)該返回false;,Java,10INTRODUCTION-1,面向?qū)ο蟾呒?jí)程序設(shè)計(jì),繼承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進(jìn)

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

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

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

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

10、ava,20INTRODUCTION-1,面向?qū)ο蟾呒?jí)程序設(shè)計(jì),接口,接口代碼重用 如果想計(jì)算一組BankAccount對(duì)象中余額的最大值和平均值?,Java,21INTRODUCTION-1,面向?qū)ο蟾呒?jí)程序設(shè)計(jì),接口,接口代碼重用 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ū)ο蟾呒?jí)程序設(shè)計(jì),接口,接口代碼重用 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ū)ο蟾呒?jí)程序設(shè)計(jì),接口,接口代碼重用 X的數(shù)據(jù)類型; 如果每個(gè)對(duì)象實(shí)現(xiàn)一個(gè)getMeasure方法來(lái)提供測(cè)量的內(nèi)容,就可實(shí)現(xiàn)一個(gè)可重用的DataSet,以add()方法為例: sum = sum + x.getMeasure(); if (count = 0 | maximum.getMeasure() x.getMeasure() maximum = x

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

14、asurable double getMeasure(); DataSet可以返回一組對(duì)象中值最大的那個(gè)對(duì)象,并計(jì)算出這一組對(duì)象的平均值,但要求對(duì)象所屬的類必須實(shí)現(xiàn)了Measurable接口。,Java,26INTRODUCTION-1,面向?qū)ο蟾呒?jí)程序設(shè)計(jì),接口,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ū)ο蟾呒?jí)程序設(shè)計(jì),接口,接口VS 類 接口中所有的方法都是抽象的,即有方法名,方法參數(shù),返回值,但沒(méi)有方法體; 接口中的方法的訪問(wèn)限制權(quán)限都是public; 接口中沒(méi)有成員變量,但可以有常量;,Java,28INTRODUCTION-1,面向?qū)ο蟾呒?jí)程序設(shè)計(jì),接口,實(shí)現(xiàn)接口 用關(guān)鍵詞implements來(lái)標(biāo)識(shí)一個(gè)類實(shí)現(xiàn)了某個(gè)接口; pub

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

17、; -虛線加上一個(gè)箭頭表示”uses”關(guān)系;,Java,30INTRODUCTION-1,面向?qū)ο蟾呒?jí)程序設(shè)計(jì),接口,使用接口前的UML圖,Java,31INTRODUCTION-1,面向?qū)ο蟾呒?jí)程序設(shè)計(jì),接口,使用接口后的UML圖,Java,32INTRODUCTION-1,面向?qū)ο蟾呒?jí)程序設(shè)計(jì),接口,接口定義語(yǔ)法 public interface InterfaceName / method signatures Example: public interface Measurable double getMeasure(); 注:接口中的方法體自動(dòng)為public,Java,33INTRO

18、DUCTION-1,面向?qū)ο蟾呒?jí)程序設(shè)計(jì),接口,類實(shí)現(xiàn)接口語(yǔ)法 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ū)ο蟾呒?jí)程序設(shè)計(jì),接口

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

20、36INTRODUCTION-1,面向?qū)ο蟾呒?jí)程序設(shè)計(jì),接口,接口和類的互換 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); /上面的語(yǔ)句是非法的,Java,37INTRODUCTION-1,面向?qū)ο蟾呒?jí)程序設(shè)計(jì),接口,接口和類的互換 接口轉(zhuǎn)換為某個(gè)實(shí)現(xiàn)了該接口的

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

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

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

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ū)ο蟾呒?jí)程序設(shè)計(jì),接口,可以定義一個(gè)測(cè)量器對(duì)相關(guān)類的對(duì)象進(jìn)行任何形式的測(cè)量 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)自帶的類,表示一個(gè)矩形) ,Java,44INTRODUCTION-1,面向?qū)ο蟾呒?jí)程序設(shè)計(jì),接口,將測(cè)量器傳給一個(gè)DataSet對(duì)象 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ū)ο蟾呒?jí)程序設(shè)計(jì),接口,(在面向?qū)ο笤O(shè)計(jì)時(shí),需要降低類與類之間的耦合性),Java,46INTRODUCTION-1,面向?qū)ο蟾呒?jí)程序設(shè)計(jì),接口,示例程序1 DataSetTest,Java,47INTRODUCTION-1,面向?qū)ο蟾呒?jí)程序設(shè)計(jì),內(nèi)部類,對(duì)于一些用途很有限的類,可將其放在要使用的方法內(nèi); public class DataSetTester public static void main(Stri

溫馨提示

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

評(píng)論

0/150

提交評(píng)論