第4講-類(lèi)對(duì)象和接口_第1頁(yè)
第4講-類(lèi)對(duì)象和接口_第2頁(yè)
第4講-類(lèi)對(duì)象和接口_第3頁(yè)
第4講-類(lèi)對(duì)象和接口_第4頁(yè)
第4講-類(lèi)對(duì)象和接口_第5頁(yè)
已閱讀5頁(yè),還剩134頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、第章類(lèi)、對(duì)象和接口第章類(lèi)、對(duì)象和接口l 4.1 編程語(yǔ)言的幾個(gè)發(fā)展階段編程語(yǔ)言的幾個(gè)發(fā)展階段l 4.2 類(lèi)類(lèi)l 4.3 對(duì)象對(duì)象l 4.4 static 關(guān)鍵字關(guān)鍵字l 4.5 this 關(guān)鍵字關(guān)鍵字l 4.6 包包l 4.7 訪問(wèn)權(quán)限訪問(wèn)權(quán)限l 4.8 類(lèi)的繼承類(lèi)的繼承l(wèi) 4.9 對(duì)象的上轉(zhuǎn)型對(duì)象對(duì)象的上轉(zhuǎn)型對(duì)象l 4.10 多態(tài)性多態(tài)性l 4.11 abstract 類(lèi)和類(lèi)和abstract方法方法l 4.12 super關(guān)鍵字關(guān)鍵字l 4.13 接口接口l 4.14 內(nèi)部類(lèi)內(nèi)部類(lèi)l 4.15 匿名類(lèi)匿名類(lèi)l 4.16 異常類(lèi)異常類(lèi)l 4.18 基本類(lèi)型的類(lèi)包裝基本類(lèi)型的類(lèi)包裝4.1 編程

2、語(yǔ)言的幾個(gè)發(fā)展階段編程語(yǔ)言的幾個(gè)發(fā)展階段l機(jī)器語(yǔ)言(如匯編語(yǔ)言)機(jī)器語(yǔ)言(如匯編語(yǔ)言) 計(jì)算機(jī)處理信息的早期語(yǔ)言是所謂的機(jī)器語(yǔ)言 指令都是由0,1組成的序列,稱(chēng)這樣的序列為一條機(jī)器指令。l過(guò)程語(yǔ)言過(guò)程語(yǔ)言 語(yǔ)言把代碼組成叫做過(guò)程或函數(shù)的塊。每個(gè)塊的目標(biāo)是完成某個(gè)任務(wù) 例如,一個(gè)C的源程序就是由若干個(gè)書(shū)寫(xiě)形式互相獨(dú)立的函數(shù)組成。l面向?qū)ο缶幊堂嫦驅(qū)ο缶幊?面向?qū)ο缶幊讨饕w現(xiàn)下列三個(gè)特性: 1.封裝性 2.繼承 3.多態(tài) 4、重載lJava語(yǔ)言是面向?qū)ο笳Z(yǔ)言,它的源程序是由若干個(gè)類(lèi)組語(yǔ)言是面向?qū)ο笳Z(yǔ)言,它的源程序是由若干個(gè)類(lèi)組成,源文件是擴(kuò)展名為成,源文件是擴(kuò)展名為.java的文本文件的文本文件

3、 4.2 類(lèi)類(lèi)l類(lèi)是組成Java程序的基本要素。l類(lèi)封裝了一類(lèi)對(duì)象的狀態(tài)和方法。l封裝的成員變量用來(lái)表示對(duì)象的狀態(tài);而成員函數(shù)表示對(duì)象的方法。l類(lèi)的實(shí)現(xiàn)包括兩部分:類(lèi)聲明和類(lèi)體。 class 梯形 float 上底,下底,高,laderArea; /變量定義 float 計(jì)算面積() /方法定義 int a; laderArea=(上底+下底)*高/2.0f; return laderArea; 1.類(lèi)聲明class People “class People”叫做類(lèi)聲明;“People” 是類(lèi)名。習(xí)慣上類(lèi)名的第一個(gè)字母大寫(xiě),但這不是必須的。 2.類(lèi)體l類(lèi)聲明之后的一對(duì)大括號(hào)“”,“”以及它們之

4、間的內(nèi)容稱(chēng)做類(lèi)體。l類(lèi)體的內(nèi)容由兩部分構(gòu)成:變量的定義變量的定義,用來(lái)刻畫(huà)屬性;另一部分是方法方法的定義,用來(lái)刻畫(huà)功能。class 梯形 float 上底,下底,高,laderArea; /變量定義 float 計(jì)算面積() /方法定義 int a; laderArea=(上底+下底)*高/2.0f; return laderArea; class 梯形 float 上底,下底,高,laderArea; /變量定義部分 int a; float 計(jì)算面積() /方法定義 int a; laderArea=(上底+下底)*高/2.0f; return laderArea; void 修改高(fl

5、oat h) /方法定義 高=h; 3.成員變量和局部變量l 類(lèi)的成員變量。l 局部變量:在方法體中定義的變量和方法的參數(shù)。l 作用域?qū)Ρ龋撼蓡T變量在整個(gè)類(lèi)內(nèi)都有效,局部變量只在定義它的方法內(nèi)有效。 l 成員變量又分為: 實(shí)例成員變量實(shí)例成員變量(簡(jiǎn)稱(chēng)實(shí)例變量)和 類(lèi)變量類(lèi)變量(也稱(chēng)靜態(tài)變量) . 成員變量的類(lèi)型前面加上關(guān)鍵字static對(duì)所有的此類(lèi)實(shí)例化的對(duì)象共享同一內(nèi)存l 如果局部變量的名字與成員變量的名字相同,則成員變量被隱藏,即這個(gè)成員變量在這個(gè)方法內(nèi)暫時(shí)失效 . 這時(shí)如果想在該方法內(nèi)使用成員變量,必須使用關(guān)鍵字this。 class 三角形 float sideA,sideB,sid

6、eC,lengthSum; void setSide(float sideA,float sideB,float sideC) this.sideA=sideA; this.sideB=sideB; this.sideC=sideC; l this.sideA,this.sideB,this.sideC就分別表示成員變量sideA,sideB,sideC 4.方法l 方法的定義包括兩部分:方法聲明和方法體。l 方法參數(shù)在整個(gè)方法內(nèi)有效;l 方法內(nèi)定義的局部變量從它定義的位置之后開(kāi)始有效。-如果局部變量的定義是在一個(gè)復(fù)合語(yǔ)句中,那么該局部變量的有效范圍是該復(fù)合語(yǔ)句,即僅在該復(fù)合語(yǔ)句中有效,如果局

7、部變量的定義是在一個(gè)循環(huán)語(yǔ)句中,那么該局部變量的有效范圍是該循環(huán)語(yǔ)句,即僅在該循環(huán)語(yǔ)句中有效 .l 和C語(yǔ)言中寫(xiě)一個(gè)函數(shù)類(lèi)似class Area float getArea(float r) return 3.14f*r*r; double getArea(float x,int y) return x*y; float getArea(int x,float y) return x*y; double getArea(float x,float y,float z) return (x*x+y*y+z*z)*2.0; 方法:類(lèi)方法和實(shí)例方法l類(lèi)中的方法分為:實(shí)例方法和類(lèi)方法.l實(shí)例方法:方法

8、聲明時(shí),方法類(lèi)型前面不加關(guān)鍵字staticl加關(guān)鍵字static的是類(lèi)方法。 l構(gòu)造方法不能用static修飾構(gòu)造方法。 類(lèi)方法和實(shí)例方法l加上static直接用類(lèi)名來(lái)調(diào)用,所以成為類(lèi)方法;l而沒(méi)有static關(guān)鍵字的方法必須用對(duì)象實(shí)例來(lái)調(diào)用,成為實(shí)例方法。構(gòu)造方法l構(gòu)造方法是一種特殊方法,它的名字必須與它所在的類(lèi)的名字完全相同,而且沒(méi)有類(lèi)型,構(gòu)造方法也可以重載。 class 梯形 float 上底,下底,高; 梯形() 上底=60; 下底=100; 高=20; 梯形(float x,int y,float h) 上底=x; 下底=y; 高=h; 缺省的構(gòu)造方法l當(dāng)沒(méi)有構(gòu)造函數(shù)時(shí),系統(tǒng)提供缺省

9、的構(gòu)造方法如果調(diào)用缺省的構(gòu)造方法l成員變量的初始化值為缺省值數(shù)值型 是0Boolean型 falseChar “0”對(duì)象 NULL構(gòu)造方法l允許有兩個(gè)不同的構(gòu)造方法,調(diào)用哪一個(gè),由主調(diào)函數(shù)的參數(shù)來(lái)決定。l-方法(函數(shù))重載方法重載l方法重載的意思是:l一個(gè)類(lèi)中的方法具有相同的名字,但參數(shù)不同,即或者是參數(shù)的個(gè)數(shù)不同,或者是參數(shù)的類(lèi)型不同。 4.3 對(duì)象對(duì)象 l類(lèi)是創(chuàng)建對(duì)象的模板。l當(dāng)使用一個(gè)類(lèi)創(chuàng)建了一個(gè)對(duì)象時(shí),我們也說(shuō)我們給出了這個(gè)類(lèi)的一個(gè)實(shí)例。1.創(chuàng)建對(duì)象l創(chuàng)建一個(gè)對(duì)象包括對(duì)象的聲明和為對(duì)象分配內(nèi)存兩個(gè)步驟。 (1)對(duì)象的聲明。一般格式為: 類(lèi)的名字類(lèi)的名字 對(duì)象名字對(duì)象名字;如: Peop

10、le zhangPing;l(2)為聲明的對(duì)象分配內(nèi)存使用new運(yùn)算符()為聲明的對(duì)象分配內(nèi)存,(2)調(diào)用構(gòu)造方法,沒(méi)有構(gòu)造方法,系統(tǒng)會(huì)調(diào)用默認(rèn)的構(gòu)造方法(默認(rèn)的構(gòu)造方法是無(wú)參數(shù)的。如: zhangPing=new People();l (3)對(duì)象的內(nèi)存模型 使用例子1來(lái)說(shuō)明對(duì)象的內(nèi)存模型 class XiyoujiRenwu float height,weight; String head, ear,hand,foot, mouth; int speak(String s) System.out.println(s); class A public static void main(Stri

11、ng args) XiyoujiRenwu zhubajie; /聲明對(duì)象 zhubajie=new XiyoujiRenwu(); /為對(duì)象分配內(nèi)存, /默認(rèn)的構(gòu)造方法 聲明對(duì)象時(shí)的內(nèi)存模型 l 當(dāng)用XiyoujiRenwu類(lèi)聲明一個(gè)變量,即對(duì)象zhubajie時(shí),如例子1中的對(duì)象zhubajie:XiyoujiRenwu zhubajie;內(nèi)存模型如左圖所示內(nèi)存模型如左圖所示 對(duì)象分配內(nèi)存后的內(nèi)存模型 l 當(dāng)系統(tǒng)見(jiàn)到: zhubajie=new XiyoujiRenwu(); 時(shí),就會(huì)做三件事: 為height,weight,head,ear,mouth,hand,foot各個(gè)變量分配內(nèi)存

12、,即XiyoujiRenwu類(lèi)的成員變量被分配內(nèi)存空間執(zhí)行構(gòu)造方法中的語(yǔ)句。 new運(yùn)算符在為變量height,weight,head,ear,mouth,hand,foot分配內(nèi)存后,將返回一個(gè)引用引用給對(duì)象變量zhubajie。 new 關(guān)鍵字的作用l為對(duì)象分配內(nèi)存空間;l調(diào)用構(gòu)造函數(shù);l為對(duì)象返回一個(gè)引用2.使用對(duì)象使用對(duì)象 l對(duì)象:可以操作自己的變量;使用創(chuàng)建它的那個(gè)類(lèi)中的方法的能力。l通過(guò)使用運(yùn)算符“.”,對(duì)象可以實(shí)現(xiàn)對(duì)自己的變量訪問(wèn)和方法的調(diào)用。l當(dāng)對(duì)象調(diào)用方法時(shí),方法中出現(xiàn)的成員變量就是指該對(duì)象的成員變量。class 梯形 float 上底,下底,高; 梯形() 上底=60; 下

13、底=100; 高=20; 梯形(float x,int y,float h) 上底=x; 下底=y; 高=h; 梯形 t;t=new 梯形();t.上底;t.梯形(40f,50,60.5f);4.4 static 關(guān)鍵字關(guān)鍵字l用static修飾的成員變量稱(chēng)為類(lèi)變量 l用static修飾的方法稱(chēng)為類(lèi)方法 實(shí)例變量和類(lèi)變量的區(qū)別l 一個(gè)類(lèi)通過(guò)使用new運(yùn)算符可以創(chuàng)建多個(gè)不同的對(duì)象;不同的對(duì)象的實(shí)例變量將被分配不同的內(nèi)存空間; 如果類(lèi)中的成員變量有類(lèi)變量,那么所有的對(duì)象的這個(gè)類(lèi)變量都分配給相同的一處內(nèi)存,改變其中一個(gè)對(duì)象的這個(gè)類(lèi)變量會(huì)影響其它對(duì)象的這個(gè)類(lèi)變量。l 類(lèi)變量是和該類(lèi)創(chuàng)建的所有對(duì)象相關(guān)聯(lián)

14、的變量,改變其中一個(gè)對(duì)象的這個(gè)類(lèi)變量就同時(shí)改變了其它對(duì)象的這個(gè)類(lèi)變量。 因此,類(lèi)變量不僅可以通過(guò)某個(gè)對(duì)象訪問(wèn)也可以直接通過(guò)類(lèi)名訪問(wèn)。 實(shí)例變量?jī)H僅是和相應(yīng)的對(duì)象關(guān)聯(lián)的變量,也就是說(shuō),不同對(duì)象的實(shí)例變量互不相同,即分配不同的內(nèi)存空間,改變其中一個(gè)對(duì)象的實(shí)例變量不會(huì)影響其它對(duì)象的這個(gè)實(shí)例變量。 實(shí)例變量可以通過(guò)對(duì)象訪問(wèn),不能使用類(lèi)名訪問(wèn)。 類(lèi)方法只能操作類(lèi)變量,而實(shí)例方法不受限制class 梯形 float 上底,下底,laderArea; /變量定義部分 float b,高; float 計(jì)算面積() /方法定義 int a; laderArea=(上底+下底)*高/2.0f; return l

15、aderArea; static void 設(shè)定高(float h) /方法定義 高=h; 注意l靜態(tài)的成員變量,可以被非靜態(tài)的方法調(diào)用,反之則不行。l為什么main是定義成靜態(tài)的?.實(shí)例方法和類(lèi)方法的區(qū)別l實(shí)例方法可以被類(lèi)創(chuàng)建的任何對(duì)象調(diào)用執(zhí)行。 l類(lèi)方法不僅可以被類(lèi)創(chuàng)建的任何對(duì)象調(diào)用執(zhí)行,也可以直接通過(guò)類(lèi)名調(diào)用 4.5 this 關(guān)鍵字關(guān)鍵字lthis是Java的一個(gè)關(guān)鍵字,表示某個(gè)對(duì)象。 lthis可以出現(xiàn)在實(shí)例方法和構(gòu)造方法中,但不可以出現(xiàn)在類(lèi)方法中。 lthis關(guān)鍵字出現(xiàn)在類(lèi)的構(gòu)造方法中時(shí),代表使用該構(gòu)造方法所創(chuàng)建的對(duì)象。 lthis關(guān)鍵字出現(xiàn)在類(lèi)的實(shí)例方法中時(shí),代表正在調(diào)用該方法的

16、當(dāng)前對(duì)象。 class 三角形 float sideA,sideB,sideC,lengthSum; void setSide(float sideA,float sideB,float sideC) this.sideA=sideA; this.sideB=sideB; this.sideC=sideC; l this.sideA,this.sideB,this.sideC就分別表示成員變量sideA,sideB,sideC 4.6 包包l包是Java語(yǔ)言中有效地管理類(lèi)的一個(gè)機(jī)制。 1.包語(yǔ)句包語(yǔ)句 l 通過(guò)關(guān)鍵字package聲明包語(yǔ)句。package 語(yǔ)句作為Java源文件的第一條語(yǔ)句,

17、指明該源文件定義的類(lèi)所在的包。package語(yǔ)句的一般格式為: package 包名;l 如果源程序中省略了package語(yǔ)句,源文件中你定義命名的類(lèi)被隱含地認(rèn)為是無(wú)名包的一部分,即源文件中定義命名的類(lèi)在同一個(gè)包中,但該包沒(méi)有名字。l 包對(duì)應(yīng)著文件系統(tǒng)的目錄層次結(jié)構(gòu)l 包名可以是一個(gè)合法的標(biāo)識(shí)符,也可以是若干個(gè)標(biāo)識(shí)符加“.”分割而成 。 在G:javacnmybole編譯的位置:運(yùn)行的位置:源文件的位置:. import 語(yǔ)句語(yǔ)句 l 使用import 語(yǔ)句可以引入包中的類(lèi)。 l在編寫(xiě)源文件時(shí),除了自己編寫(xiě)類(lèi)外,我們經(jīng)常需要使用Java提供的許多類(lèi),這些類(lèi)可能在不同的包中。 l在學(xué)習(xí)Java語(yǔ)

18、言時(shí),使用已經(jīng)存在的類(lèi),避免一切從頭做起,這是面向?qū)ο缶幊痰囊粋€(gè)重要方面。 l/jre/lib/rt.jar 包,io, lang.java.lang自動(dòng)導(dǎo)入,如其中的system類(lèi)和String類(lèi),不需import語(yǔ)句導(dǎo)入系統(tǒng)提供的類(lèi)類(lèi)的說(shuō)明符lpublic說(shuō)明符l沒(méi)有說(shuō)明符類(lèi)名前沒(méi)有public,則只能在同一個(gè)包中的類(lèi)訪問(wèn),否則必須聲明為public類(lèi)也可以將此類(lèi)在要訪問(wèn)它的類(lèi)中被import,或給出完整路徑4.7訪問(wèn)權(quán)限訪問(wèn)權(quán)限l 類(lèi)創(chuàng)建了一個(gè)對(duì)象之后,該對(duì)象可以通過(guò)“.”運(yùn)算符操作自己的變量、使用類(lèi)中的方法,但對(duì)象操作自己的變量和使用類(lèi)中的方法是有一定限制的。 l 所謂訪問(wèn)權(quán)限是指對(duì)象

19、是否可以通過(guò)“.”運(yùn)算符操作自己的變量或通過(guò)“.”運(yùn)算符使用類(lèi)中的方法。 l 訪問(wèn)限制修飾符有private、protected和public,都是Java的關(guān)鍵字,用來(lái)修飾成員變量或方法。 l class XiyoujiRenwu pubilc static float height,weight; String head, ear,hand,foot, mouth; public void speak(String s) System.out.println(s); class A public static void main(String args) XiyoujiRenwu zhub

20、ajie; /聲明對(duì)象 zhubajie=new XiyoujiRenwu(); /為對(duì)象分配內(nèi)存, XiyoujiRenwu.height; XiyoujiRenwu.height; 1.私有變量和私有方法-privatel一個(gè)類(lèi)在另外一個(gè)類(lèi)中創(chuàng)建一個(gè)對(duì)象后,該對(duì)象不能訪問(wèn)自己的私有變量和私有方法 l對(duì)于一個(gè)類(lèi)的私有類(lèi)變量(靜態(tài)成員變量),那么在另外一個(gè)類(lèi)中,也不能通過(guò)類(lèi)名來(lái)操作這個(gè)私有類(lèi)變量。 .共有變量和共有方法l一個(gè)類(lèi)在另外一個(gè)類(lèi)中創(chuàng)建一個(gè)對(duì)象后,該對(duì)象能訪問(wèn)自己的public變量和public方法 l對(duì)于一個(gè)類(lèi)的public類(lèi)變量(靜態(tài)成員變量),那么在另外一個(gè)類(lèi)中,也能通過(guò)類(lèi)名來(lái)操

21、作這個(gè)public類(lèi)變量。3.友好變量和友好方法l 不用private、public 、protected修飾符的成員變量和方法被稱(chēng)為友好變量和友好方法。 l 一個(gè)類(lèi)在另外一個(gè)類(lèi)中創(chuàng)建一個(gè)對(duì)象后,如果兩個(gè)類(lèi)在同一包中,該對(duì)象能訪問(wèn)自己的友好變量和友好方法 l 對(duì)于一個(gè)類(lèi)的友好類(lèi)變量(靜態(tài)成員變量),如果兩個(gè)類(lèi)在同一包中,那么在另外一個(gè)類(lèi)中,也能通過(guò)類(lèi)名來(lái)操作這個(gè)友好類(lèi)變量。注意:.受保護(hù)的成員變量和方法受保護(hù)的成員變量和方法 l一個(gè)類(lèi)在另外一個(gè)類(lèi)中創(chuàng)建一個(gè)對(duì)象后,如果兩個(gè)類(lèi)在同一包中,該對(duì)象能訪問(wèn)自己的protected變量和protected方法 l對(duì)于一個(gè)類(lèi)的protected類(lèi)變量(靜態(tài)

22、成員變量),如果兩個(gè)類(lèi)在同一包中,那么在另外一個(gè)類(lèi)中,也能通過(guò)類(lèi)名來(lái)操作這個(gè)protected類(lèi)變量。protected和“友好”之間區(qū)別?在繼承上4.8類(lèi)的繼承類(lèi)的繼承l(wèi)繼承是一種由已有的類(lèi)創(chuàng)建新類(lèi)的機(jī)制。l先創(chuàng)建一個(gè)共有屬性的一般類(lèi),根據(jù)該一般類(lèi)再創(chuàng)建具有特殊屬性的新類(lèi),新類(lèi)繼承一般類(lèi)的狀態(tài)和行為,并根據(jù)需要增加它自己的新的狀態(tài)和行為。l由繼承而得到的類(lèi)稱(chēng)為子類(lèi),被繼承的類(lèi)稱(chēng)為父類(lèi)(超類(lèi))。lJava不支持多重繼承(子類(lèi)只能有一個(gè)父類(lèi))。1.子類(lèi)l 在類(lèi)的聲明中,通過(guò)使用關(guān)鍵字extends來(lái)創(chuàng)建一個(gè)類(lèi)的子類(lèi),格式如下:class 子類(lèi)名 extends 父類(lèi)名 例如:class Stud

23、ents extends People 2.子類(lèi)的繼承性l 類(lèi)有可以有兩種重要的成員:成員變量和方法。子類(lèi)的成員中有一部分是子類(lèi)自己聲明定義的,另一部分是從它的父類(lèi)繼承的。 l 所謂子類(lèi)繼承父類(lèi)的成員變量作為自己的一個(gè)成員變量,就好象它們是在子類(lèi)中直接聲明一樣,可以被子類(lèi)中自己聲明的任何實(shí)例方法操作.l 所謂子類(lèi)繼承父類(lèi)的方法作為子類(lèi)中的一個(gè)方法,就象它們是在子類(lèi)中直接聲明一樣,可以被子類(lèi)中自己聲明的任何實(shí)例方法調(diào)用。 子類(lèi)和父類(lèi)在同一包中的繼承性 l如果子類(lèi)和父類(lèi)在同一個(gè)包中,那么,子類(lèi)自然地繼承了其父類(lèi)中不是private的成員變量作為自己的成員變量;l并且也自然地繼承了父類(lèi)中不是priv

24、ate的方法作為自己的方法;l繼承的成員或方法的訪問(wèn)權(quán)限保持不變。 子類(lèi)和父類(lèi)不在同一包中的繼承性 l子類(lèi)繼承了父類(lèi)的protected、public成員變量做為子類(lèi)的成員變量;l并且繼承了父類(lèi)的protected、public方法為子類(lèi)的方法, 繼承的成員或方法的訪問(wèn)權(quán)限保持不變。l子類(lèi)不能繼承父類(lèi)的友好變量和友好方法。訪問(wèn)權(quán)限小結(jié)l Private:-同包和不同包的其他類(lèi)中創(chuàng)建的對(duì)象,均不得訪問(wèn),只有在本類(lèi)中創(chuàng)建的對(duì)象可以訪問(wèn);子類(lèi)也不能繼承;l Protected:-只要是同包中創(chuàng)建的對(duì)象就能訪問(wèn);-同包和不同包中的子類(lèi)均可繼承;l 缺?。?必須是同包中創(chuàng)建的對(duì)象可以訪問(wèn);-同包中創(chuàng)建的

25、子類(lèi)可以繼承;l Public:-任何包中創(chuàng)建的對(duì)象均可訪問(wèn);-任何包中創(chuàng)建的子類(lèi)也可繼承。3.成員變量的隱藏和方法的重寫(xiě)l父類(lèi)成員變量的隱藏:只要子類(lèi)中定義的成員變量和父類(lèi)中的成員變量同名。l方法重寫(xiě)是指:子類(lèi)中定義一個(gè)方法,并且這個(gè)方法的名字、返回類(lèi)型、參數(shù)個(gè)數(shù)和類(lèi)型與從父類(lèi)繼承的方法完全相同。 l如果子類(lèi)重寫(xiě)了父類(lèi)的方法,則運(yùn)行時(shí)系統(tǒng)調(diào)用子類(lèi)重寫(xiě)的方法子類(lèi)重寫(xiě)父類(lèi)時(shí),不能降低訪問(wèn)權(quán)限4. final關(guān)鍵字l final關(guān)鍵字可以修飾類(lèi)、成員變量、方法和方法中的參數(shù)。l final類(lèi)不能被繼承,即不能有子類(lèi)。如String類(lèi) l 方法被修飾為final,則這個(gè)方法不能被重寫(xiě)。l 成員變量被

26、修飾為final,就是常量,常量必須賦給初值,而且不能再發(fā)生變化;但也可以在構(gòu)造函數(shù)中初始化 ;l 方法的參數(shù)被修飾為final,該參數(shù)的值不能被改變。final舉例lfinal 可以定義常量,lfinal PI=3.1415926;4.9 多態(tài)性多態(tài)性l多態(tài)性就是指父類(lèi)的某個(gè)方法被其子類(lèi)重寫(xiě)時(shí),可以各自產(chǎn)生自己的功能行為 .l為什么要多態(tài)?(1)和上轉(zhuǎn)型技術(shù)結(jié)合可以將做什么和怎么做分開(kāi) (2)后期綁定技術(shù)來(lái)保證編碼無(wú)需提前知曉導(dǎo)出類(lèi)就可編程 (3)程序擴(kuò)展性好d多態(tài)性缺陷l基類(lèi)的私有方法無(wú)法覆蓋,無(wú)法實(shí)現(xiàn)多態(tài);l靜態(tài)方法也無(wú)法實(shí)現(xiàn)多態(tài);域也無(wú)法使用多態(tài)構(gòu)造器和多態(tài)構(gòu)造器的調(diào)用順序:調(diào)用基類(lèi)構(gòu)

27、造器-無(wú)限遞歸調(diào)用成員初始化-導(dǎo)出類(lèi)的構(gòu)造器多態(tài)小結(jié)l需要數(shù)據(jù)抽象、繼承和動(dòng)態(tài)綁定技術(shù)l編程時(shí)要考慮類(lèi)和類(lèi)之間的共性以及聯(lián)系l可以使的程序具有更好的結(jié)構(gòu)、擴(kuò)展性和可維護(hù)性4.10 abstract 類(lèi)和類(lèi)和abstract方法方法labstract 類(lèi):類(lèi):用關(guān)鍵字abstract修飾的類(lèi)(抽象類(lèi))。 abstract class A 為什么要有抽象類(lèi)?()形成不同子類(lèi)的通用接口;()在編譯中確保不允許產(chǎn)生對(duì)象;abstract類(lèi)有如下特點(diǎn) l 和普通的類(lèi)相比,abstract類(lèi)可以有abstract方法。l 對(duì)于abstract方法,只允許聲明,不允許實(shí)現(xiàn),而且不允許使用final修飾abs

28、tract方法。abstract class A int min(int x,int y) int max(int x,int y) return xy?x:y; labstract類(lèi)不能用new運(yùn)算創(chuàng)建對(duì)象 對(duì)于abstract類(lèi),我們不能使用new運(yùn)算符創(chuàng)建該類(lèi)的對(duì)象; 需產(chǎn)生其子類(lèi),由子類(lèi)創(chuàng)建對(duì)象; 如果一個(gè)類(lèi)是abstract類(lèi)的子類(lèi),它必須具體實(shí)現(xiàn)父類(lèi)的abstract方法,這就是為什么不允許使用final修飾abstract方法的原因。Abstract Class A.abstract方法abstract void submethod();他所在的類(lèi)必須標(biāo)為abstract類(lèi)4.1

29、1 super關(guān)鍵字關(guān)鍵字l子類(lèi)不繼承父類(lèi)的構(gòu)造方法;l子類(lèi)使用父類(lèi)的構(gòu)造方法,必須:-在子類(lèi)的構(gòu)造方法中使用,必須使用關(guān)鍵字super來(lái)表示,而且super必須是子類(lèi)構(gòu)造方法中的頭一條語(yǔ)句。 l在子類(lèi)使用被子類(lèi)隱藏了的父類(lèi)的成員變量或方法就可以使用關(guān)鍵字super。比如:super.x、super.play(),就是被子類(lèi)隱藏的父類(lèi)的成員變量x和方法play()。 4.12 接口接口lJava不支持多繼承性,即一個(gè)類(lèi)只能有一個(gè)父類(lèi)。單繼承性使得Java簡(jiǎn)單,易于管理程序。l為了克服單繼承的缺點(diǎn),Java使用了接口,一個(gè)類(lèi)可以實(shí)現(xiàn)多個(gè)接口。1.接口的聲明與使用l 使用關(guān)鍵字interface來(lái)

30、定義一個(gè)接口。接口的定義和類(lèi)的定義很相似,分為接口的聲明和接口體。l 接口體中包含常量定義和方法定義兩部分。接口體中只進(jìn)行方法的聲明,不許提供方法的實(shí)現(xiàn),所以,方法的定義沒(méi)有方法體,且用分號(hào)“;”結(jié)尾。如:interface Printable final int MAX=100; void add(); float sum(float x ,float y);接口的使用 l一個(gè)類(lèi)通過(guò)使用關(guān)鍵字implements 聲明自己使用一個(gè)或多個(gè)接口。如果使用多個(gè)接口,用逗號(hào)隔開(kāi)接口名。如:class A implements Printable,Addablel如果一個(gè)類(lèi)使用了某個(gè)接口,那么這個(gè)類(lèi)必

31、須實(shí)現(xiàn)該接口的所有方法,即為這些方法提供方法體 .lP80的例題注意:l如果實(shí)現(xiàn)接口的類(lèi)沒(méi)有實(shí)現(xiàn)接口的所要的方法,則必須標(biāo)為抽象類(lèi);接口的回調(diào)Videocard.java-定義接口Dmeng.java-實(shí)現(xiàn)接口中的方法Mainboard.java-Computer.java抽象類(lèi)和接口的區(qū)別?l(1)單繼承,多實(shí)現(xiàn);l(2)含有成員變量,只有常量;l(3)成員方法可以部分實(shí)現(xiàn),成員方法都不能實(shí)現(xiàn)。盡量選inferface4.14 內(nèi)部類(lèi)內(nèi)部類(lèi)lJava支持在一個(gè)類(lèi)中聲明另一個(gè)類(lèi),這樣的類(lèi)稱(chēng)作內(nèi)部類(lèi),而包含內(nèi)部類(lèi)的類(lèi)成為內(nèi)部類(lèi)的外嵌類(lèi)。 l內(nèi)部類(lèi)的類(lèi)體中不可以聲明類(lèi)變量和類(lèi)方法。l外嵌類(lèi)的類(lèi)體中

32、可以用內(nèi)部類(lèi)聲明對(duì)象,作為外嵌類(lèi)的成員。 通過(guò)內(nèi)部類(lèi)可以訪問(wèn)外部類(lèi)的私有方法或私有成員變量外部類(lèi)成員變量、內(nèi)部類(lèi)成員變量和局部變量之間?/在外部類(lèi)的非static中/內(nèi)部類(lèi)的方法中的局部變量/內(nèi)部類(lèi)的成員變量/外部類(lèi)的成員變量?jī)?nèi)部類(lèi)的字節(jié)碼文件名Inner inner=new Inner();內(nèi)部類(lèi)解決了多重繼承問(wèn)題如書(shū)上P204例子l內(nèi)部類(lèi)可以設(shè)計(jì)為private或protected,而普通類(lèi)只可以是友好的和public,l如果是private,除了他所在的外部類(lèi)外其他的類(lèi)中都不可以訪問(wèn)它,l而protected時(shí)候,只有外部類(lèi)、外部類(lèi)的繼承類(lèi),和同包類(lèi),其他都不能訪問(wèn)l隱蔽了內(nèi)部類(lèi)l如果內(nèi)

33、部類(lèi)放在某個(gè)方法里,就只有這個(gè)方法可以訪問(wèn)它匿名類(lèi)lC+如何處理錯(cuò)誤的?lJava解決方案是常規(guī)的操作和錯(cuò)誤處理操作分開(kāi)。4.16 異常類(lèi)異常類(lèi) l程序運(yùn)行出現(xiàn)異常時(shí),Java運(yùn)行環(huán)境就用異常類(lèi)Exception的相應(yīng)子類(lèi)創(chuàng)建一個(gè)異常對(duì)象,并等待處理,例如,讀取一個(gè)不存在的文件時(shí),運(yùn)行環(huán)境就用異常類(lèi)IOException創(chuàng)建一個(gè)對(duì)象異常對(duì)象可以調(diào)用如下方法得到或輸出有關(guān)異常的信息:public String getMessage() public void printStackTrace() public String toString()l trycatch語(yǔ)句的格式如下:try 包含可能發(fā)

34、生異常的語(yǔ)句 catch(ExceptionSubClass1 e) catch(ExceptionSubClass2 e) l使用trycatch語(yǔ)句來(lái)處理異常:l將可能出現(xiàn)的異常操作放在trycatch語(yǔ)句的try部分;l當(dāng)try部分中的某個(gè)語(yǔ)句發(fā)生異常后,try部分將立刻結(jié)束執(zhí)行,而轉(zhuǎn)向執(zhí)行相應(yīng)的catch部分;l所以程序可以將發(fā)生異常后的處理放在 catch部分。trycatch語(yǔ)句可以由幾個(gè)catch組成,分別處理發(fā)生的相應(yīng)異常。 4.18 基本類(lèi)型的類(lèi)包裝基本類(lèi)型的類(lèi)包裝lJava的基本數(shù)據(jù)類(lèi)型包括:byte、int、short、long、float、double、char。Jav

35、a同時(shí)也提供了基本數(shù)據(jù)類(lèi)型相關(guān)的類(lèi),實(shí)現(xiàn)了對(duì)基本數(shù)據(jù)類(lèi)型的封裝。這些類(lèi)在java.lang包中,分別是:Byte、Integer、Short、Long、Float、Double和Character類(lèi)。Integer a=new Integer(55); int b=Value(); 1. Double和和Float類(lèi)類(lèi) l Double類(lèi)和Float類(lèi)實(shí)現(xiàn)了對(duì)double和float基本型數(shù)據(jù)的類(lèi)包裝。l 可以使用Double類(lèi)的構(gòu)造方法: Double (double num)創(chuàng)建一個(gè)Double類(lèi)型的對(duì)象;使用Float類(lèi)的構(gòu)造方法: Float (float num)創(chuàng)建一個(gè)F

36、loat類(lèi)型的對(duì)象。Double對(duì)象調(diào)用doubleValue()方法可以返回該對(duì)象含有的double型數(shù)據(jù);Float對(duì)象調(diào)用floatValue()方法可以返回該對(duì)象含有的float型數(shù)據(jù)。2. Byte、Integer、Short、Long類(lèi)類(lèi) l 下述構(gòu)造方法分別可以創(chuàng)建Byte、Integer、Short和Long類(lèi)型的對(duì)象:Byte(byte num)Integer(int num)Short(short num)Long(long num)l Byte、Integer、Short和Long對(duì)象分別調(diào)用byteValue ()、intValue()、shortValue ()和lo

37、ngValue ()方法可以返回該對(duì)象含有的基本型數(shù)據(jù)。 lJava的異常處理lJava的異常處理是通過(guò)5個(gè)關(guān)鍵字來(lái)實(shí)現(xiàn)的:try,catch,throw,throws,finally。JB的在線幫助中對(duì)這幾個(gè)關(guān)鍵字是這樣解釋的: l l Throws: Lists the exceptions a method could throw. l l Throw: Transfers control of the method to the exception handler. l l Try: Opening exception-handling statement. l l Catch: Ca

38、ptures the exception. l l Finally: Runs its code before terminating the program. l try語(yǔ)句 l try語(yǔ)句用大括號(hào)指定了一段代碼,該段代碼可能會(huì)拋棄一個(gè)或多個(gè)例外。 l l catch語(yǔ)句 l catch語(yǔ)句的參數(shù)類(lèi)似于方法的聲明,包括一個(gè)例外類(lèi)型和一個(gè)例外對(duì)象。例外類(lèi)型必須為T(mén)hrowable類(lèi)的子類(lèi),它指明了catch語(yǔ)句所處理的例外類(lèi)型,例外對(duì)象則由運(yùn)行時(shí)系統(tǒng)在try所指定的代碼塊中生成并被捕獲,大括號(hào)中包含對(duì)象的處理,其中可以調(diào)用對(duì)象的方法。 l l catch語(yǔ)句可以有多個(gè),分別處理不同類(lèi)的例外。J

39、ava運(yùn)行時(shí)系統(tǒng)從上到下分別對(duì)每個(gè)catch語(yǔ)句處理的例外類(lèi)型進(jìn)行檢測(cè),直到找到類(lèi)型相匹配的catch語(yǔ)句為止。這里,類(lèi)型匹配指catch所處理的例外類(lèi)型與生成的例外對(duì)象的類(lèi)型完全一致或者是它的父類(lèi),因此,catch語(yǔ)句的排列順序應(yīng)該是從特殊到一般。 l l l l 也可以用一個(gè)catch語(yǔ)句處理多個(gè)例外類(lèi)型,這時(shí)它的例外類(lèi)型參數(shù)應(yīng)該是這多個(gè)例外類(lèi)型的父類(lèi),程序設(shè)計(jì)中要根據(jù)具體的情況來(lái)選擇catch語(yǔ)句的例外處理類(lèi)型。 l l finally語(yǔ)句 l try所限定的代碼中,當(dāng)拋棄一個(gè)例外時(shí),其后的代碼不會(huì)被執(zhí)行。通過(guò)finally語(yǔ)句可以指定一塊代碼。無(wú)論try所指定的程序塊中拋棄或不拋棄例外

40、,也無(wú)論catch語(yǔ)句的例外類(lèi)型是否與所拋棄的例外的類(lèi)型一致,finally所指定的代碼都要被執(zhí)行,它提供了統(tǒng)一的出口。通常在finally語(yǔ)句中可以進(jìn)行資源的清除工作。如關(guān)閉打開(kāi)的文件等。 l l throws語(yǔ)句 l throws總是出現(xiàn)在一個(gè)函數(shù)頭中,用來(lái)標(biāo)明該成員函數(shù)可能拋出的各種異常。對(duì)大多數(shù)Exception子類(lèi)來(lái)說(shuō),Java 編譯器會(huì)強(qiáng)迫你聲明在一個(gè)成員函數(shù)中拋出的異常的類(lèi)型。如果異常的類(lèi)型是Error或 RuntimeException, 或它們的子類(lèi),這個(gè)規(guī)則不起作用, 因?yàn)檫@在程序的正常部分中是不期待出現(xiàn)的。 如果你想明確地拋出一個(gè)RuntimeException,你必須用

41、throws語(yǔ)句來(lái)聲明它的類(lèi)型。 l l throw語(yǔ)句 l throw總是出現(xiàn)在函數(shù)體中,用來(lái)拋出一個(gè)異常。程序會(huì)在throw語(yǔ)句后立即終止,它后面的語(yǔ)句執(zhí)行不到,然后在包含它的所有try塊中(可能在上層調(diào)用函數(shù)中)從里向外尋找含有與其匹配的catch子句的try塊。lclass myException extends Exceptionl String msg;l myException(int age)l msg=age can not be positive!;l l public String toString()l return msg;l llclass Agel public

42、void intage(int n) throws myException/l if(n120)l myException e=new myException(n);l throw e; /是一個(gè)轉(zhuǎn)向語(yǔ)句,拋出對(duì)象實(shí)例,停止執(zhí)行后面的代碼l l if(n=0)l System.out.print(合理的年齡!);l l l lpublic static void main(String args) l int a=-5;l try /try catch 必需有l(wèi) Age age = new Age();l age(a);/觸發(fā)異常l System.out.print(拋出異常后的代碼) ;/這段代碼是不會(huì)被執(zhí)行的,程序已經(jīng)被轉(zhuǎn)向l catch (myException ex) l System.out.print(ex.toString();l l finally/無(wú)論拋不拋異常,無(wú)論catch語(yǔ)句的異常類(lèi)型是否與所拋出的例外的類(lèi)型一致,finally所指定的代碼都要被執(zhí)行,它提供了統(tǒng)一的出口。l Sy

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論