Java面向?qū)ο筇匦跃玙第1頁
Java面向?qū)ο筇匦跃玙第2頁
Java面向?qū)ο筇匦跃玙第3頁
Java面向?qū)ο筇匦跃玙第4頁
Java面向?qū)ο筇匦跃玙第5頁
已閱讀5頁,還剩34頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、第四章第四章 Java面向?qū)ο筇匦悦嫦驅(qū)ο筇匦??對(duì)象與類對(duì)象與類 ?對(duì)象生命周期對(duì)象生命周期 ?類的創(chuàng)建類的創(chuàng)建 ?重載重載 ?子類子類 1 對(duì)象的基本概念對(duì)象的基本概念 面向?qū)ο蟪绦蛘Z言三個(gè)關(guān)鍵特點(diǎn):面向?qū)ο蟪绦蛘Z言三個(gè)關(guān)鍵特點(diǎn): ?封裝封裝 ( Encapsulation ) ?多態(tài)多態(tài) ( Polymorphism ) ?繼承繼承 ( Inheritance ) 2 抽象數(shù)據(jù)類型抽象數(shù)據(jù)類型 ?基本數(shù)據(jù)類型和聚集類型的變量與一些操作基本數(shù)據(jù)類型和聚集類型的變量與一些操作 (如(如+, -)之間不需特殊的聯(lián)系。)之間不需特殊的聯(lián)系。 ?在面向?qū)ο笳Z言中,在數(shù)據(jù)類型的聲明與操作在面向?qū)ο笳Z

2、言中,在數(shù)據(jù)類型的聲明與操作 這些數(shù)據(jù)的代碼聲明之間建立緊密聯(lián)系,這種這些數(shù)據(jù)的代碼聲明之間建立緊密聯(lián)系,這種 聯(lián)系通常描述為一種抽象數(shù)據(jù)類型。聯(lián)系通常描述為一種抽象數(shù)據(jù)類型。 ? 在在Java中,抽象數(shù)據(jù)類型的概念用類來實(shí)現(xiàn)。中,抽象數(shù)據(jù)類型的概念用類來實(shí)現(xiàn)。 3 類和對(duì)象類和對(duì)象 ?類是特定類型對(duì)象的定義,包括:對(duì)象包含的類是特定類型對(duì)象的定義,包括:對(duì)象包含的 數(shù)據(jù),對(duì)象的創(chuàng)建及對(duì)象對(duì)自身數(shù)據(jù)操作的方法。數(shù)據(jù),對(duì)象的創(chuàng)建及對(duì)象對(duì)自身數(shù)據(jù)操作的方法。 ?類是一個(gè)模板。類是一個(gè)模板。 ?對(duì)象是在其類模型基礎(chǔ)上構(gòu)造出的,是具體的對(duì)象是在其類模型基礎(chǔ)上構(gòu)造出的,是具體的 實(shí)例。實(shí)例。 4 類和對(duì)

3、象舉例類和對(duì)象舉例 類定義:類定義:Class EmpInfo String name; String designation; String department; void print( ) System.out.println(name+“is”+ designation+“at”+department); 對(duì)象的生成與使用:對(duì)象的生成與使用: EmpInfo employee = new EmpInfo( ); = “ Robert Javaman”; employee.designation = “Manager”; employee.department

4、 = “Coffee shop”; employee.print( ); . 5 對(duì)象生命周期對(duì)象生命周期 創(chuàng)建對(duì)象 創(chuàng)建對(duì)象 使用對(duì)象使用對(duì)象 清除不用的對(duì)象清除不用的對(duì)象 6 ? ? ? 創(chuàng)建對(duì)象創(chuàng)建對(duì)象 創(chuàng)建對(duì)象的三個(gè)步驟:創(chuàng)建對(duì)象的三個(gè)步驟: ? ? 聲明聲明 (Declaration ) ? ? 實(shí)例化(實(shí)例化(Instantiation) ? ? 初始化(初始化(Initialization) 例:例: Point origin_one ; origin_one = new Point(23, 94); Rectangle rect_one = new Rectangle(orig

5、in_one, 100, 200); Rectangle rect_two = new Rectangle(50, 100); 7 對(duì)象實(shí)例化過程對(duì)象實(shí)例化過程 構(gòu)造與初始化對(duì)象的過程(調(diào)用構(gòu)造與初始化對(duì)象的過程(調(diào)用new Xxxx(): ? ?開辟內(nèi)存空間(變量、方法體代碼)及類成員開辟內(nèi)存空間(變量、方法體代碼)及類成員 變量變量 的初始化的初始化: 數(shù)值型:數(shù)值型:0; 布爾型:布爾型:false; 引用型:引用型:null; 字符串型:字符串型:null; ? ? 顯式初始化:執(zhí)行類成員聲明時(shí)帶有的簡單顯式初始化:執(zhí)行類成員聲明時(shí)帶有的簡單 賦值賦值 表達(dá)式。表達(dá)式。 public

6、class Initialized private int x = 5 ; private String name = “Fred”; ? ?執(zhí)行構(gòu)造函數(shù)。執(zhí)行構(gòu)造函數(shù)。 8 對(duì)象的回收對(duì)象的回收 ?垃圾收集機(jī)制(垃圾收集機(jī)制(garbage collection):):Java運(yùn)行環(huán)境當(dāng)確定運(yùn)行環(huán)境當(dāng)確定 某個(gè)對(duì)象不再被使用時(shí),將其刪除。某個(gè)對(duì)象不再被使用時(shí),將其刪除。 ?一個(gè)對(duì)象在沒有引用指向它時(shí),可作為垃圾收集。一個(gè)對(duì)象在沒有引用指向它時(shí),可作為垃圾收集。 ?垃圾搜集器:垃圾搜集器:Java運(yùn)行環(huán)境中的垃圾搜集器周期性地釋放運(yùn)行環(huán)境中的垃圾搜集器周期性地釋放 不用對(duì)象占用的空間。不用對(duì)象

7、占用的空間。 9 垃圾收集機(jī)制垃圾收集機(jī)制 C+: :A *a=new A( ); A *b=a; A *c=a; /a 使用完,將其刪除使用完,將其刪除 delete a; Java :A a=new A( ); A b=a; A c=a; /a 使用完,將其刪除使用完,將其刪除 a= null ; a b c b c (指針懸空) b c 10 a b c 類的創(chuàng)建類的創(chuàng)建 ? 11 類的構(gòu)造函數(shù)類的構(gòu)造函數(shù) ?構(gòu)造方法定義:構(gòu)造方法定義: public 類名(參數(shù))類名(參數(shù)) 注意:注意: ?方法名必須與類名相同。 方法名必須與類名相同。 ?不能帶返回類型。 不能帶返回類型。 12 缺

8、省構(gòu)造函數(shù)缺省構(gòu)造函數(shù) ?如果在類定義中無構(gòu)造函數(shù),如果在類定義中無構(gòu)造函數(shù), Java 在編譯時(shí)在編譯時(shí) 可缺省加入構(gòu)造方法。如可缺省加入構(gòu)造方法。如 public Employee( ) ; ?一旦在類中有一個(gè)自己聲明的構(gòu)造函數(shù),則缺省一旦在類中有一個(gè)自己聲明的構(gòu)造函數(shù),則缺省 的構(gòu)造函數(shù)將不被加到源程序中。的構(gòu)造函數(shù)將不被加到源程序中。 13 類成員方法定義類成員方法定義 ?一般格式:一般格式: ()throws ?方法是傳值的,方法調(diào)用不會(huì)改變參數(shù)的值。方法是傳值的,方法調(diào)用不會(huì)改變參數(shù)的值。 ?當(dāng)對(duì)象作為參數(shù)時(shí),參數(shù)的值是該對(duì)象的引用,當(dāng)對(duì)象作為參數(shù)時(shí),參數(shù)的值是該對(duì)象的引用, 這時(shí)

9、對(duì)象的內(nèi)容可以在方法中改變,但是對(duì)象的這時(shí)對(duì)象的內(nèi)容可以在方法中改變,但是對(duì)象的 引用不會(huì)改變。引用不會(huì)改變。 14 舉例舉例 Public class PassTest float ptValue; public void changeInt(int value) value = 55 ; public void changeStr(String value) value = new String(different“); public void changeObjValue( PassTest ref) ref.ptValue = 99.0f; public static void mai

10、n(String args ) String str; int val; PassTest pt= new PassTest( ); 結(jié)果:結(jié)果: val = 11; Int Value is : 11 pt.changeInt(val); Str Value is : hello System.out.println(“Int value is:” +val); str = new String(“hello”); pt value is : 99.0f pt.changeStr(str); System.out.println(“str value is:” +str); pt.ptval

11、ue = 101.0f ; pt.changeObjValue(pt); System.out.println(“pt value is:” +pt.ptValue); 15 數(shù)據(jù)隱藏與封裝數(shù)據(jù)隱藏與封裝 ?數(shù)據(jù)隱藏:使用數(shù)據(jù)隱藏:使用private定義的成員變量,只能定義的成員變量,只能 在成員方法中使用,其它方法中禁止使用。在成員方法中使用,其它方法中禁止使用。 優(yōu)點(diǎn):優(yōu)點(diǎn): 保證對(duì)象中數(shù)據(jù)的一致性。保證對(duì)象中數(shù)據(jù)的一致性。 ?封裝:基本數(shù)據(jù)和對(duì)數(shù)據(jù)進(jìn)行的操作方法的結(jié)合。封裝:基本數(shù)據(jù)和對(duì)數(shù)據(jù)進(jìn)行的操作方法的結(jié)合。 優(yōu)點(diǎn):優(yōu)點(diǎn): ?隱藏類中具體實(shí)現(xiàn)的細(xì)節(jié)。 隱藏類中具體實(shí)現(xiàn)的細(xì)節(jié)。 ?強(qiáng)迫

12、程序員使用統(tǒng)一的接口訪問數(shù)據(jù)。 強(qiáng)迫程序員使用統(tǒng)一的接口訪問數(shù)據(jù)。 ?使代碼可維護(hù)性好。 使代碼可維護(hù)性好。 16 數(shù)據(jù)隱藏與封裝舉例數(shù)據(jù)隱藏與封裝舉例 Class Date private int day, month, year; void setDate( int a, int b, int c) day = a; month = b; year = c ; Date d1; d1.new Date( ); d1.day = 30;( 錯(cuò)誤!)錯(cuò)誤?。?d1.setDate(30,9,2001); . 17 “this “ 引用引用 關(guān)鍵字關(guān)鍵字this 用來指向當(dāng)前對(duì)象本身。用來指向當(dāng)

13、前對(duì)象本身。 例:例:class Date private int day, month,year; public Date getTommorrow( ) this.day+; 18 重載(重載(Overloading) ?含義:在同一個(gè)類中一個(gè)方法名被用來定義多個(gè)含義:在同一個(gè)類中一個(gè)方法名被用來定義多個(gè) 方法。方法。 classScreen public void print( int i) public void print( float i) public void print( String str ) ?重載必須遵守原則:重載必須遵守原則: ? 參數(shù)表必須不同,以此區(qū)分不同方法體

14、。 參數(shù)表必須不同,以此區(qū)分不同方法體。 ?返回類型、修飾符可相同或不相同。 返回類型、修飾符可相同或不相同。 19 激活重載的構(gòu)造函數(shù)激活重載的構(gòu)造函數(shù) 在一個(gè)構(gòu)造函數(shù)中可以利用另一個(gè)構(gòu)造函數(shù)。在一個(gè)構(gòu)造函數(shù)中可以利用另一個(gè)構(gòu)造函數(shù)。 class Employee private String name; private int salary; public Employee(String n, int s) name = n ; salary = s; public Employee( String n) this(n,0); public Employee( ) this(“Unknow

15、n” ”); 20 子類子類 ?子類表示類之間一種子類表示類之間一種“屬于屬于” 例:例:public class Employee String name ; Date hireDate ; Date dateofBirth ; String jobTitle ; int grade ; ( is a ) 關(guān)系。關(guān)系。 public class Manager String name ; Date hireDate ; Date dateofBirth ; String jobTitle ; int grade ; String department ; Employee subordina

16、tes; 21 Extends 關(guān)鍵字關(guān)鍵字 ? Java中用中用 extends 關(guān)鍵字定義子類。關(guān)鍵字定義子類。 public class Employee String name ; Date hireDate ; Date dateofBirth ; String jobTitle ; int grade ; public class Manager extends Employee String department ; Employee subordinates; ?子類是從已有的類創(chuàng)建新類的一種方法。子類是從已有的類創(chuàng)建新類的一種方法。 22 子類子類 ?子類繼承父類的屬性、功能

17、(方法),子類中只子類繼承父類的屬性、功能(方法),子類中只 需聲明特有的東西。需聲明特有的東西。 ?帶帶private 修飾符的屬性、方法是不能被繼承的。修飾符的屬性、方法是不能被繼承的。 ?構(gòu)造函數(shù)不能被繼承。構(gòu)造函數(shù)不能被繼承。 ?在方法中調(diào)用構(gòu)造方法用在方法中調(diào)用構(gòu)造方法用 this() 。 ?調(diào)用父類的構(gòu)造方法用調(diào)用父類的構(gòu)造方法用 super() 。 - super 指向該關(guān)鍵字所在類的父類。指向該關(guān)鍵字所在類的父類。 23 構(gòu)造不同類型數(shù)據(jù)的集合構(gòu)造不同類型數(shù)據(jù)的集合 ? Java中允許構(gòu)造如下類型的數(shù)組:中允許構(gòu)造如下類型的數(shù)組: Employee staff = new Em

18、ployee1024; staff0 = new Manager( ); staff1 = new Worker(); staff2 = new Employee(); - staff 是由多種類型的對(duì)象組成的。是由多種類型的對(duì)象組成的。 ? Java中任何一個(gè)子類的實(shí)例都可作為父類的實(shí)例中任何一個(gè)子類的實(shí)例都可作為父類的實(shí)例 使用,可以調(diào)用父類具有的方法。使用,可以調(diào)用父類具有的方法。 24 單繼承單繼承 Java 是單繼承的,即只能從一個(gè)類繼承,是單繼承的,即只能從一個(gè)類繼承, 后類名只能有一個(gè)。后類名只能有一個(gè)。 單繼承的優(yōu)點(diǎn):單繼承的優(yōu)點(diǎn): ?代碼更可靠 代碼更可靠 ?可以用接口彌補(bǔ)

19、可以用接口彌補(bǔ) 用一個(gè)類實(shí)現(xiàn)多個(gè)接口,達(dá)到多繼承效果。用一個(gè)類實(shí)現(xiàn)多個(gè)接口,達(dá)到多繼承效果。 25 ? extends ? 重寫(重寫(Overriding methods) ?子類可以改變從父類繼承的行為。子類可以改變從父類繼承的行為。 ?被重寫方法的返回值、方法名、參數(shù)列表要被重寫方法的返回值、方法名、參數(shù)列表要 與父類中的方法完全一樣。與父類中的方法完全一樣。 26 Overriding 示例示例 public class Stack private Vector items; / code for Stacks methods and constructor not shown / o

20、verrides Objects toString method public String toString() int n = items.size(); StringBuffer result = new StringBuffer(); result.append(); for (int i = 0; i n; i+) result.append(items.elementAt(i).toString(); if (i n-1) result.append(,); result.append(); return result.toString(); 27 方法重寫的規(guī)則方法重寫的規(guī)則 必

21、須返回與原來方法完全相同的返回值。必須返回與原來方法完全相同的返回值。 方法的訪問權(quán)限不能縮小。方法的訪問權(quán)限不能縮小。 不能拋出新的例外。不能拋出新的例外。 28 ? ? ? 多多 態(tài)態(tài) An object has only one form, while a variable is polymorphism,since it can refer to objects of different forms ,polymorphism is the ability to have many different forms. 29 多多 態(tài)態(tài) ? Java允許父類對(duì)象的變量作為子類對(duì)象的變量允許

22、父類對(duì)象的變量作為子類對(duì)象的變量 使用。使用。 如:如:Employee e = new Manager( ); ?但通過該變量但通過該變量(如如e)只能訪問父類的方法,子類只能訪問父類的方法,子類 特有的部分被隱藏。特有的部分被隱藏。 ?運(yùn)行時(shí)確定使用父類還是子類的方法。運(yùn)行時(shí)確定使用父類還是子類的方法。 Employee e = new Manager(); e.getDetails(); 30 Super 關(guān)鍵字關(guān)鍵字 Super 指向該關(guān)鍵字所在類的父類。指向該關(guān)鍵字所在類的父類。 Public class Empolyee private String name ; private

23、int salary; public String getDetails( ) return “Name: ”+name+“ nSalary:”+salary; public class Manager extends Empolyee private String department ; public String getDetails( ) return super .getDetailes( )+ nDepartment: “+ department; 31 “instanceof” 及類型強(qiáng)制轉(zhuǎn)換及類型強(qiáng)制轉(zhuǎn)換 ? Instanceof 測試對(duì)象類型測試對(duì)象類型 Empolyee a

24、 = new Manager(); 則則 a instanceof Manager 為為true; ?類型轉(zhuǎn)換類型轉(zhuǎn)換 父類弱、子類強(qiáng),指向父類的引用不能直接按子類引用,父類弱、子類強(qiáng),指向父類的引用不能直接按子類引用, 必須要強(qiáng)制類型轉(zhuǎn)換后才能作為子類的引用使用。必須要強(qiáng)制類型轉(zhuǎn)換后才能作為子類的引用使用。 例:例:public void method( Employee e) if (e instanceof Manager) Manager m = (Manager) e ; m.department = “”; 32 子類對(duì)象的初始化子類對(duì)象的初始化 初始化對(duì)象是很結(jié)構(gòu)化的。初始化對(duì)象

25、是很結(jié)構(gòu)化的。 在對(duì)對(duì)象初始化時(shí),分三步:在對(duì)對(duì)象初始化時(shí),分三步: ?分配空間,并初始化為 分配空間,并初始化為“ 0” 值。值。 ?按繼承關(guān)系從頂向下顯式初始化。 按繼承關(guān)系從頂向下顯式初始化。 ?按繼承關(guān)系從頂向下調(diào)用構(gòu)造函數(shù)。按繼承關(guān)系從頂向下調(diào)用構(gòu)造函數(shù)。 33 ? ? 調(diào)用父類構(gòu)造方法調(diào)用父類構(gòu)造方法 ?缺省是不帶參數(shù)的構(gòu)造方法。缺省是不帶參數(shù)的構(gòu)造方法。 ?如果需要調(diào)用特殊的父類構(gòu)造方法,則需在如果需要調(diào)用特殊的父類構(gòu)造方法,則需在 子類構(gòu)造方法中第一行通過子類構(gòu)造方法中第一行通過 super( )調(diào)用。調(diào)用。 class Employee . public Employee(

26、String n) name=n; class Manager entends Emplyee public Manager( String s,String d) super(s); . 34 Object 及其子類及其子類 Object定義了所有對(duì)象都需要的狀態(tài)和行定義了所有對(duì)象都需要的狀態(tài)和行 為。如對(duì)象之間的比較、將對(duì)象轉(zhuǎn)換為字為。如對(duì)象之間的比較、將對(duì)象轉(zhuǎn)換為字 符串、等待某個(gè)條件變量、當(dāng)某條件變量符串、等待某個(gè)條件變量、當(dāng)某條件變量 改變時(shí)通知相關(guān)對(duì)象改變時(shí)通知相關(guān)對(duì)象 以及返回對(duì)象的類。以及返回對(duì)象的類。 35 Object 及其子類及其子類 在在ObjectObject子類中可

27、以重寫的方法:子類中可以重寫的方法: cloneclone equalsequals finalizefinalize toStringtoString :返回對(duì)象的字符串表示,表達(dá)的內(nèi)容因具體的對(duì)象而異:返回對(duì)象的字符串表示,表達(dá)的內(nèi)容因具體的對(duì)象而異 在在ObjectObject子類中不能重寫的方法:子類中不能重寫的方法: getClassgetClass notifynotify notifyAllnotifyAll waitwait 36 ? ? ? ? ? ? ? ? ? ? Object 的clone方法 ? aCloneableObject aCloneableObject.clone();.clone(); /從已有的對(duì)象創(chuàng)建從已有的對(duì)象創(chuàng)建 新的對(duì)象新的對(duì)象 ?注意:注意: ? aCloneableObjectaCloneableObject 必須實(shí)現(xiàn)了必須實(shí)現(xiàn)了Cloneable接口接口 ?Object.clone()是是shallow copy 而不是而不是 deep

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(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)論