CH03Java面向?qū)ο蟪绦蛟O(shè)計(jì).ppt_第1頁(yè)
CH03Java面向?qū)ο蟪绦蛟O(shè)計(jì).ppt_第2頁(yè)
CH03Java面向?qū)ο蟪绦蛟O(shè)計(jì).ppt_第3頁(yè)
CH03Java面向?qū)ο蟪绦蛟O(shè)計(jì).ppt_第4頁(yè)
CH03Java面向?qū)ο蟪绦蛟O(shè)計(jì).ppt_第5頁(yè)
已閱讀5頁(yè),還剩69頁(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)介

第3章 Java的面向?qū)ο蟪绦蛟O(shè)計(jì),面向?qū)ο蟪绦虻母拍?類(lèi)(class) 對(duì)象(object) static 關(guān)鍵字 this 關(guān)鍵字 包(package) 訪問(wèn)權(quán)限 類(lèi)的繼承 對(duì)象的上轉(zhuǎn)型對(duì)象 多態(tài)性,abstract 類(lèi)和abstract方法 super關(guān)鍵字 接口(interface) 內(nèi)部類(lèi) 匿名類(lèi) 異常類(lèi) Class類(lèi) 基本類(lèi)型的類(lèi)包裝 反編譯和文檔生成器 jar文件,3.1 面向?qū)ο蟪绦虻母拍?機(jī)器語(yǔ)言(如匯編語(yǔ)言) 計(jì)算機(jī)處理信息的早期語(yǔ)言是所謂的機(jī)器語(yǔ)言,這種語(yǔ)言中的指令都是由0,1組成的序列,稱(chēng)這樣的序列為一條機(jī)器指令。 過(guò)程語(yǔ)言 語(yǔ)言把代碼組成叫做過(guò)程或函數(shù)的塊。每個(gè)塊的目標(biāo)是完成某個(gè)任務(wù),例如,一個(gè)C的源程序就是由若干個(gè)書(shū)寫(xiě)形式互相獨(dú)立的函數(shù)組成。 面向?qū)ο缶幊?面向?qū)ο缶幊讨饕w現(xiàn)下列三個(gè)特性: 1. 封裝性(Encapsulation) 2. 繼承性(Inheritance) 3. 多態(tài)性(Polymorphism) Java語(yǔ)言是面向?qū)ο笳Z(yǔ)言,它的源程序是由若干個(gè)類(lèi)組成,源文件是擴(kuò)展名為.java的文本文件,3.2 類(lèi)(class),class是組成Java程序的基本要素。類(lèi)封裝了一類(lèi)對(duì)象的狀態(tài)和方法。類(lèi)是用來(lái)定義對(duì)象的模板。 類(lèi)的結(jié)構(gòu)分為兩個(gè)兩部分:類(lèi)聲明(Class Declaration)和類(lèi)體(Class Body),格式如下: 類(lèi)聲明 類(lèi)體; 如, public class People String name; . ,1. 類(lèi)聲明 (Class Declaration),類(lèi)聲明的格式: 類(lèi)修飾符 class 類(lèi)名 extends 父類(lèi)名 implements 接口表列 類(lèi)體; 類(lèi)聲明由關(guān)鍵字class、類(lèi)名、類(lèi)修飾符三部分組成 關(guān)鍵字class用固定的小寫(xiě)字母格式 類(lèi)名:符合Java書(shū)寫(xiě)規(guī)范的標(biāo)識(shí)符 類(lèi)修飾符:可選,可以為public 、缺省、abstract、final,用于說(shuō)明類(lèi)的訪問(wèn)控制 “public class People”叫做類(lèi)聲明 “People” 是類(lèi)名。習(xí)慣上類(lèi)名的第一個(gè)字母大寫(xiě),但不是必須的,2. 類(lèi)體(Class Body),寫(xiě)類(lèi)的目的是為了描述一類(lèi)事物共有的屬性和功能,描述過(guò)程由類(lèi)體來(lái)實(shí)現(xiàn)。類(lèi)聲明之后的一對(duì)大括號(hào)“”,“”以及它們之間的內(nèi)容稱(chēng)做類(lèi)體,大括號(hào)之間的內(nèi)容稱(chēng)做類(lèi)體的內(nèi)容。 類(lèi)體的內(nèi)容由兩部分構(gòu):一部分是變量的定義,用來(lái)刻畫(huà)屬性;另一部分是方法的定義,用來(lái)刻畫(huà)類(lèi)的功能。,class 梯形 float 上底, 下底, 高, laderArea; / 變量定義部分 float 計(jì)算面積() / 方法定義 laderArea = (上底 + 下底) * 高 / 2.0f; return laderArea; void 修改高(float h) / 方法定義 高 = h; ,3. 成員變量和局部變量 (Member Variables & Local Variables),類(lèi)體中的變量分為兩部分 成員變量:變量定義部分所定義的變量被稱(chēng)為類(lèi)的成員變量; 局部變量:在方法體中定義的變量和方法的參數(shù)被稱(chēng)為局部變量; 成員變量在整個(gè)類(lèi)內(nèi)都有效,局部變量只在定義它的方法內(nèi)有效; 成員變量又分為實(shí)例成員變量(簡(jiǎn)稱(chēng)實(shí)例變量)和類(lèi)變量(也稱(chēng)靜態(tài)變量); 如果局部變量的名字與成員變量的名字相同,則成員變量被隱藏,即這個(gè)成員變量在這個(gè)方法內(nèi)暫時(shí)失效。此時(shí)如果想在該方法內(nèi)使用成員變量,必須使用關(guān)鍵字this。 成員變量 定義:修飾符 變量類(lèi)型 變量名; 修飾符:pubic、private、protected、默認(rèn)(友好型),static(類(lèi)變量),final(常量) 變量類(lèi)型:可以是簡(jiǎn)單類(lèi)型、數(shù)組類(lèi)型、類(lèi)(String、Date、第三方類(lèi)、自定義類(lèi))類(lèi)型 變量名:合法的Java標(biāo)識(shí)符 局部變量 定義:變量類(lèi)型 變量名; 變量類(lèi)型:可以是簡(jiǎn)單類(lèi)型、數(shù)組類(lèi)型、類(lèi)(String、Date、自定義類(lèi))類(lèi)型 變量名:合法的Java標(biāo)識(shí)符,class 三角形 float sideA, sideB, sideC, lengthSum; void setSide(float sideA, float sideB, float sideC) this.sideA = sideA; this.sideB = sideB; this.sideC = sideC; 其中,this.sideA、this.sideB、this.sideC 就分別表示成員變量 sideA、sideB、 sideC,4. 方法(Method ),方法的概念 描述對(duì)象所具有的功能或操作,反映對(duì)象的行為,是具有某種相對(duì)獨(dú)立功能的程序模塊 方法的類(lèi)型 從來(lái)源看:類(lèi)庫(kù)方法、用戶自定義方法 從參數(shù)個(gè)數(shù)看:無(wú)參方法、有參方法 方法定義的格式(方法聲明、方法體) 修飾符 返回值類(lèi)型 成員方法名(形參表) throws 異常表 方法體; 修飾符:pubic、private、protected、默認(rèn)(友好型),static(靜態(tài)方法),final(最終方法), abstract(抽象方法), native(本地方法) 返回值類(lèi)型:簡(jiǎn)單類(lèi)型、數(shù)組類(lèi)型、void型、類(lèi)(String、Date、其他類(lèi))類(lèi)型 形參表:格式為 (形參類(lèi)型1 形參變量1,形參類(lèi)型2 形參變量2,. ),java native方法是指本地方法,當(dāng)在方法中調(diào)用一些不是由java語(yǔ)言寫(xiě)的代碼或者在方法中用java語(yǔ)言直接操縱計(jì)算機(jī)硬件時(shí)要聲明為native方法。 java中,通過(guò)JNI(Java Native Interface,java本地接口)來(lái)實(shí)現(xiàn)本地化。,5. 方法的參數(shù)(Arguments ),方法的參數(shù) 在整個(gè)方法內(nèi)有效,方法內(nèi)定義的局部變量從它定義的位置之后開(kāi)始有效; 如果局部變量的定義是在一個(gè)復(fù)合語(yǔ)句中,那么該局部變量的有效范圍是該復(fù)合語(yǔ)句,即僅在該復(fù)合語(yǔ)句中有效; 如果局部變量的定義是在一個(gè)循環(huán)語(yǔ)句中,那么該局部變量的有效范圍是該循環(huán)語(yǔ)句,即僅在該循環(huán)語(yǔ)句中有效 寫(xiě)一個(gè)方法和C語(yǔ)言中寫(xiě)一個(gè)函數(shù)類(lèi)似,只不過(guò)在這里稱(chēng)做方法,6. 方法重載(Overload),方法重載的意思是:一個(gè)類(lèi)中可以有多個(gè)方法具有相同的名字,但這些方法的參數(shù)必須不同,即或者是參數(shù)的個(gè)數(shù)不同,或者是參數(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; ,7. 構(gòu)造方法(Constructor),構(gòu)造方法是一種特殊方法,主要作用是在類(lèi)創(chuàng)建對(duì)象時(shí)進(jìn)行初始化。 當(dāng)用類(lèi)創(chuàng)對(duì)象時(shí),使用構(gòu)造方法 構(gòu)造方法的名字必須與它所在的類(lèi)的名字完全相同,而且沒(méi)有類(lèi)型; 用戶不能直接調(diào)用構(gòu)造方法;構(gòu)造方法是在用戶創(chuàng)建對(duì)象時(shí),由系統(tǒng)自動(dòng)調(diào)用執(zhí)行 構(gòu)造方法的作用是對(duì)類(lèi)對(duì)象進(jìn)行初始化;構(gòu)造方法也可以重載。 類(lèi)中可以不定義構(gòu)造方法,系統(tǒng)將為該類(lèi)默認(rèn)定義一個(gè)構(gòu)造方法,即默認(rèn)構(gòu)造方法。用默認(rèn)構(gòu)造方法初始化對(duì)象時(shí),系統(tǒng)用默認(rèn)值初始化對(duì)象的數(shù)據(jù)成員。,構(gòu)造方法(Constructor),class 梯形 float 上底, 下底, 高; 梯形() 梯形(float x, float y, float h) 上底 = x; 下底 = y; 高 = h; ,8. 類(lèi)方法和實(shí)例方法,類(lèi)中的方法分為實(shí)例方法和類(lèi)方法 方法聲明時(shí),方法類(lèi)型前面不加關(guān)鍵字static的是實(shí)例方法、加關(guān)鍵字static的是類(lèi)方法。 構(gòu)造方法是特殊的方法,不能用static修飾構(gòu)造方法。 類(lèi)方法可以通過(guò)類(lèi)名直接引用,實(shí)例方法必須通過(guò)類(lèi)的對(duì)象來(lái)引用,3.3 對(duì)象,類(lèi)是創(chuàng)建對(duì)象的模板。當(dāng)使用一個(gè)類(lèi)創(chuàng)建了一個(gè)對(duì)象時(shí),我們也說(shuō)我們給出了這個(gè)類(lèi)的一個(gè)實(shí)例。,1. 創(chuàng)建對(duì)象,創(chuàng)建一個(gè)對(duì)象包括對(duì)象的聲明和為對(duì)象分配內(nèi)存兩個(gè)步驟 (1) 對(duì)象的聲明 一般格式為: 類(lèi)的名字 對(duì)象名字; 如: People zhangPing; (2)為聲明的對(duì)象分配內(nèi)存 使用new運(yùn)算符和類(lèi)的構(gòu)造方法為聲明的對(duì)象分配內(nèi)存,如果類(lèi)中沒(méi)有構(gòu)造方法,系統(tǒng)會(huì)調(diào)用默認(rèn)的構(gòu)造方法(默認(rèn)的構(gòu)造方法是無(wú)參數(shù)的,你一定還記得構(gòu)造方法的名字必須和類(lèi)名相同這一規(guī)定)。如: zhangPing=new People();,下面舉例說(shuō)明對(duì)象的內(nèi)存模型 class XiyoujiRenwu float height, weight; String head, ear, hand, foot, mouth; void speak(String s) System.out.println(s); class Test public static void main(String args) XiyoujiRenwu zhubajie; / 聲明對(duì)象 zhubajie = new XiyoujiRenwu(); / 為對(duì)象分配內(nèi)存, / 使用new 運(yùn) 算 符和默認(rèn)的構(gòu)造方法 ,2. 對(duì)象的內(nèi)存模型,3. 聲明對(duì)象時(shí)的內(nèi)存模型,當(dāng)用XiyoujiRenwu類(lèi)聲明一個(gè)變量,即對(duì)象zhubajie后, XiyoujiRenwu zhubajie; 此時(shí),變量zhubajie內(nèi)存模型如左圖所示:,4. 對(duì)象分配內(nèi)存后的內(nèi)存模型,當(dāng)系統(tǒng)執(zhí)行到 zhubajie =new XiyoujiRenwu(); 時(shí),就會(huì)做兩件事: 為height,weight,head,ear,mouth,hand,foot各個(gè)變量分配內(nèi)存,即XiyoujiRenwu類(lèi)的成員變量被分配內(nèi)存空間,然后執(zhí)行構(gòu)造方法中的語(yǔ)句。 new運(yùn)算符在為變量height,weight,head,ear,mouth,hand,foot分配內(nèi)存后,將返回一個(gè)引用給對(duì)象變量zhubajie。,5. 使用對(duì)象,對(duì)象不僅可以操作自己的變量改變狀態(tài),而且還擁有了使用創(chuàng)建它的那個(gè)類(lèi)中的方法的能力,對(duì)象通過(guò)使用這些方法可以產(chǎn)生一定的行為。 通過(guò)使用運(yùn)算符“.”,對(duì)象可以實(shí)現(xiàn)對(duì)自己的變量訪問(wèn)和方法的調(diào)用。 當(dāng)對(duì)象調(diào)用方法時(shí),方法中出現(xiàn)的成員變量就是指該對(duì)象的成員變量。,6. 對(duì)象的引用和實(shí)體,當(dāng)用類(lèi)創(chuàng)建一個(gè)對(duì)象時(shí),類(lèi)中的成員變量被分配內(nèi)存空間,這些內(nèi)存空間稱(chēng)做該對(duì)象的實(shí)體,而對(duì)象中存放著引用,以確保實(shí)體由該對(duì)象操作使用。 一個(gè)類(lèi)創(chuàng)建的兩個(gè)對(duì)象,如果具有相同的引用,那么就具有完全相同的實(shí)體。 沒(méi)有實(shí)體的對(duì)象稱(chēng)作空對(duì)象,空對(duì)象不能使用,即不能讓一個(gè)空對(duì)象去調(diào)用方法產(chǎn)生行為。 例:3.1,3.2,3.3,3.4:對(duì)象的聲明、引用,7. 參數(shù)傳值,當(dāng)方法被調(diào)用時(shí),如果方法有參數(shù),參數(shù)必須要實(shí)例化,即參數(shù)變量必須有具體的值。 在Java中,方法的所有參數(shù)都是“傳值”的,也就是說(shuō),方法中參數(shù)變量的值是調(diào)用者指定的值的拷貝(基本類(lèi)型的參數(shù)接收的實(shí)參變量的value,對(duì)象參數(shù)接收的實(shí)參對(duì)象的引用) 。 例如,如果向方法的int型參數(shù)x傳遞一個(gè)int值,那么參數(shù)x得到的值是傳遞值的拷貝。方法如果改變參數(shù)的值,不會(huì)影響向參數(shù)“傳值”的變量的值。,8. 基本數(shù)據(jù)類(lèi)型參數(shù)的傳值,對(duì)于基本數(shù)據(jù)類(lèi)型的參數(shù),向該參數(shù)傳遞的值的級(jí)別不可以高于該參數(shù)的級(jí)別 比如,不可以向int型參數(shù)傳遞一個(gè)float值,但可以向double型參數(shù)傳遞一個(gè)float值。,9. 引用類(lèi)型參數(shù)的傳值,Java的引用型數(shù)據(jù)包括對(duì)象、數(shù)組和接口。當(dāng)參數(shù)是引用類(lèi)型時(shí),“傳值”傳遞的是變量的引用而不是變量所引用的實(shí)體。 如果改變參數(shù)變量所引用的實(shí)體,就會(huì)導(dǎo)致原變量的實(shí)體發(fā)生同樣的變化。但是,改變參數(shù)的引用不會(huì)影響向其傳值的變量的引用。,參數(shù)傳遞舉例 例3.5,3.6: 簡(jiǎn)單類(lèi)型參數(shù)傳遞和對(duì)象參數(shù)傳遞,3.5 null 關(guān)鍵字,null用來(lái)標(biāo)識(shí)一個(gè)不確定的對(duì)象。 可以將null賦給引用類(lèi)型變量,但不可以將null賦給基本類(lèi)型變量。 如int x=null; /非法 String str=null, int arr=null; People p=null; /合法 null本身不是對(duì)象,也不是Objcet的實(shí)例 測(cè)試“null instanceof java.lang.Object”的值為falase null的其他作用 判斷一個(gè)引用類(lèi)型數(shù)據(jù)是否null。 用=來(lái)判斷。 釋放內(nèi)存,讓一個(gè)非null的引用類(lèi)型變量指向null。這樣這個(gè)對(duì)象就不再被任何對(duì)象應(yīng)用了。等待JVM垃圾回收機(jī)制去回收。,3.6 static 關(guān)鍵字,用static修飾的成員變量稱(chēng)為類(lèi)變量 static int x=5; 用static修飾的方法稱(chēng)為類(lèi)方法 public static String currentDate(),1. 實(shí)例變量和類(lèi)變量的區(qū)別,一個(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èi)變量是和該類(lèi)創(chuàng)建的所有對(duì)象相關(guān)聯(lián)的變量,改變其中一個(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)。,2. 實(shí)例方法和類(lèi)方法的區(qū)別,實(shí)例方法可以被類(lèi)創(chuàng)建的任何對(duì)象調(diào)用執(zhí)行。 類(lèi)方法不僅可以被類(lèi)創(chuàng)建的任何對(duì)象調(diào)用執(zhí)行,也可以直接通過(guò)類(lèi)名調(diào)用 例3.7: static關(guān)鍵字,3.7 this 關(guān)鍵字,this是Java的一個(gè)關(guān)鍵字,表示某個(gè)對(duì)象。 this可以出現(xiàn)在實(shí)例方法和構(gòu)造方法中,但不可以出現(xiàn)在類(lèi)方法中。 this關(guān)鍵字出現(xiàn)在類(lèi)的構(gòu)造方法中時(shí),代表使用該構(gòu)造方法所創(chuàng)建的對(duì)象。 this關(guān)鍵字出現(xiàn)在類(lèi)的實(shí)例方法中時(shí),代表正在調(diào)用該方法的當(dāng)前對(duì)象。 例3.8: this關(guān)鍵字,3.8 包(Package),包是Java語(yǔ)言中有效地管理類(lèi)的一個(gè)機(jī)制。 Java通過(guò)關(guān)鍵字package聲明包語(yǔ)句。 package 語(yǔ)句作為Java源文件的第一條語(yǔ)句,指明該源文件定義的類(lèi)所在的包。 package語(yǔ)句的一般格式為: package 包名; 包名可以是一個(gè)合法的標(biāo)識(shí)符,也可以是若干個(gè)標(biāo)識(shí)符加“.”分割而成 。 如 package cn.zzuli.cs,1. 包語(yǔ)句,如果源程序中省略了package語(yǔ)句,源文件中你定義命名的類(lèi)被隱含地認(rèn)為是無(wú)名包的一部分,即源文件中定義命名的類(lèi)在同一個(gè)包中,但該包沒(méi)有名字。 例3.9:package關(guān)鍵字,2. import 語(yǔ)句,使用import 語(yǔ)句可以引入包中的類(lèi)。 在編寫(xiě)源文件時(shí),除了自己編寫(xiě)類(lèi)外,我們經(jīng)常需要使用Java提供的許多類(lèi),這些類(lèi)可能在不同的包中。 在學(xué)習(xí)Java語(yǔ)言時(shí),使用已經(jīng)存在的類(lèi),避免一切從頭做起,這是面向?qū)ο缶幊痰囊粋€(gè)重要方面。 例3.10,3.11,3.12,3. 將自定義的類(lèi)打成jar包,程序代碼見(jiàn)例2.13 打包命令 編譯:javac -d . *.java 打包:jar cvf myzzuli.jar cn/ Eclpse中打包 右擊包名Export Java/Jar file Next 輸入“jar包名.jar” Finish,3. 訪問(wèn)權(quán)限,類(lèi)創(chuàng)建了一個(gè)對(duì)象之后,該對(duì)象可以通過(guò)“.”運(yùn)算符操作自己的變量、使用類(lèi)中的方法,但對(duì)象操作自己的變量和使用類(lèi)中的方法是有一定限制的。 所謂訪問(wèn)權(quán)限是指對(duì)象是否可以通過(guò)“.”運(yùn)算符操作自己的變量或通過(guò)“.”運(yùn)算符使用類(lèi)中的方法。 訪問(wèn)限制修飾符有private、protected和public,都是Java的關(guān)鍵字,用來(lái)修飾成員變量或方法。,4. 私有變量和私有方法,一個(gè)類(lèi)(A)在另外一個(gè)類(lèi)(B)中創(chuàng)建一個(gè)對(duì)象后,該對(duì)象(b)不能訪問(wèn)自己的私有變量和私有方法 對(duì)于一個(gè)類(lèi)的私有類(lèi)變量(靜態(tài)成員變量),那么在另外一個(gè)類(lèi)中,也不能通過(guò)類(lèi)名來(lái)操作這個(gè)私有類(lèi)變量。 例3.14:私有變量和私有方法舉例,class A private int a1; int a2; protected int a3; public int a4; private void fa1() void fa2() ,class B void fbx() A a = new A(); a.a1 = 12; / 非法 a.a2 = 13; a.a3 = 14; a.fa1(); / 非法 a.fa2(); ,5. 公有變量和公有方法,一個(gè)類(lèi)在另外一個(gè)類(lèi)中創(chuàng)建一個(gè)對(duì)象后,該對(duì)象能訪問(wèn)自己的public變量和public方法 對(duì)于一個(gè)類(lèi)的public類(lèi)變量(靜態(tài)成員變量),那么在另外一個(gè)類(lèi)中,也能通過(guò)類(lèi)名來(lái)操作這個(gè)public類(lèi)變量。,6. 友好變量和友好方法,不用private、public 、protected修飾符的成員變量和方法被稱(chēng)為友好變量和友好方法。 一個(gè)類(lèi)在另外一個(gè)類(lèi)中創(chuàng)建一個(gè)對(duì)象后,如果兩個(gè)類(lèi)在同一包中,該對(duì)象能訪問(wèn)自己的友好變量和友好方法 對(duì)于一個(gè)類(lèi)的友好類(lèi)變量(靜態(tài)成員變量),如果兩個(gè)類(lèi)在同一包中,那么在另外一個(gè)類(lèi)中,也能通過(guò)類(lèi)名來(lái)操作這個(gè)友好類(lèi)變量。,7. 受保護(hù)的成員變量和方法,一個(gè)類(lèi)在另外一個(gè)類(lèi)中創(chuàng)建一個(gè)對(duì)象后,如果兩個(gè)類(lèi)在同一包中,該對(duì)象能訪問(wèn)自己的protected變量和protected方法 對(duì)于一個(gè)類(lèi)的protected類(lèi)變量(靜態(tài)成員變量),如果兩個(gè)類(lèi)在同一包中,那么在另外一個(gè)類(lèi)中,也能通過(guò)類(lèi)名來(lái)操作這個(gè)protected類(lèi)變量。 在后面學(xué)習(xí)類(lèi)的繼承時(shí),將講述protected和“友好”之間在繼承方面的區(qū)別。,8. public類(lèi)和友好類(lèi),類(lèi)聲明時(shí),如果關(guān)鍵詞class前面加上public關(guān)鍵字,就稱(chēng)這樣的類(lèi)是一個(gè)public類(lèi)。 可以在任何另外一個(gè)類(lèi)中使用public類(lèi)創(chuàng)建的對(duì)象。 類(lèi)聲明時(shí),如果關(guān)鍵詞class前面,沒(méi)有任何關(guān)鍵詞修飾,就稱(chēng)這樣的類(lèi)是一個(gè)友好類(lèi)。那么,另外一個(gè)類(lèi)中使用友好類(lèi)創(chuàng)建的對(duì)象時(shí),要保證它們是在同一個(gè)包中。 注1:不能用protected和private修飾類(lèi)(內(nèi)部類(lèi)除外)。 注2:訪問(wèn)權(quán)限的級(jí)別從高到低依次為:public、protected、友好的、private。,3.9 類(lèi)的繼承,繼承是一種由已有的類(lèi)創(chuàng)建新類(lèi)的機(jī)制。 利用繼承,可以先創(chuàng)建一個(gè)公有屬性的一般類(lèi),根據(jù)該一般類(lèi)再創(chuàng)建具有特殊屬性的新類(lèi),新類(lèi)繼承一般類(lèi)的狀態(tài)和行為,并根據(jù)需要增加它自己的新的狀態(tài)和行為。 由繼承而得到的類(lèi)稱(chēng)為子類(lèi),被繼承的類(lèi)稱(chēng)為父類(lèi)(超類(lèi))。Java不支持多重繼承(子類(lèi)只能有一個(gè)父類(lèi))。,1. 子類(lèi),在類(lèi)的聲明中,通過(guò)使用關(guān)鍵字extends來(lái)創(chuàng)建一個(gè)類(lèi)的子類(lèi),格式如下: class 子類(lèi)名 extends 父類(lèi)名 例如: class Students extends People ,2. 子類(lèi)的繼承性,類(lèi)有可以有兩種重要的成員:成員變量和方法。子類(lèi)的成員中有一部分是子類(lèi)自己聲明定義的,另一部分是從它的父類(lèi)繼承的。 所謂子類(lèi)繼承父類(lèi)的成員變量作為自己的一個(gè)成員變量,就好象它們是在子類(lèi)中直接聲明一樣,可以被子類(lèi)中自己聲明的任何實(shí)例方法操作. 所謂子類(lèi)繼承父類(lèi)的方法作為子類(lèi)中的一個(gè)方法,就象它們是在子類(lèi)中直接聲明一樣,可以被子類(lèi)中自己聲明的任何實(shí)例方法調(diào)用。,3. 子類(lèi)和父類(lèi)在同一包中的繼承性,如果子類(lèi)和父類(lèi)在同一個(gè)包中,那么,子類(lèi)自然地繼承了其父類(lèi)中不是private的成員變量作為自己的成員變量,并且也自然地繼承了父類(lèi)中不是private的方法作為自己的方法, 繼承的成員或方法的訪問(wèn)權(quán)限保持不變。 例3.15,4. 子類(lèi)和父類(lèi)不在同一包中的繼承性,如果子類(lèi)和父類(lèi)不在同一個(gè)包中,那么,子類(lèi)繼承了父類(lèi)的protected、public成員變量做為子類(lèi)的成員變量,并且繼承了父類(lèi)的protected、public方法為子類(lèi)的方法, 繼承的成員或方法的訪問(wèn)權(quán)限保持不變。 如果子類(lèi)和父類(lèi)不在同一個(gè)包里,子類(lèi)不能繼承父類(lèi)的友好變量和友好方法。,5. 成員變量的隱藏和方法的重寫(xiě),子類(lèi)也可以隱藏繼承的成員變量,對(duì)于子類(lèi)可以從父類(lèi)繼承的成員變量,只要子類(lèi)中定義的成員變量和父類(lèi)中的成員變量同名時(shí),子類(lèi)就隱藏了繼承的成員變量; 子類(lèi)通過(guò)方法的重寫(xiě)可以隱藏繼承的方法 ,方法重寫(xiě)是指:子類(lèi)中定義一個(gè)方法,并且這個(gè)方法的名字、返回類(lèi)型、參數(shù)個(gè)數(shù)和類(lèi)型與從父類(lèi)繼承的方法完全相同; 對(duì)于子類(lèi)創(chuàng)建的一個(gè)對(duì)象,如果子類(lèi)重寫(xiě)了父類(lèi)的方法,則運(yùn)行時(shí)系統(tǒng)調(diào)用子類(lèi)重寫(xiě)的方法,如果子類(lèi)繼承了父類(lèi)的方法(未重寫(xiě)),那么子類(lèi)創(chuàng)建的對(duì)象也可以調(diào)用這個(gè)方法,只不過(guò)方法產(chǎn)生的行為和父類(lèi)的相同而已。 例3.16, 3.17,6. final關(guān)鍵字,final關(guān)鍵子可以修飾類(lèi)、成員變量和方法中的參數(shù)。 final類(lèi)不能被繼承,即不能有子類(lèi)。 如果一個(gè)方法被修飾為final方法,則這個(gè)方法不能被重寫(xiě) 如果一個(gè)成員變量被修飾為final的,就是常量,常量必須賦給初值,而且不能再發(fā)生變化。 如果方法的參數(shù)被修飾為final的,該參數(shù)的值不能被改變 例3.18,7. 對(duì)象的上轉(zhuǎn)型對(duì)象,假設(shè)B類(lèi)是A類(lèi)子類(lèi)或間接子類(lèi),當(dāng)我們用子類(lèi)B創(chuàng)建一個(gè)對(duì)象,并把這個(gè)對(duì)象的引用放到A類(lèi)的對(duì)象中時(shí): A a; B b=new B(); a=b; 稱(chēng)這個(gè)A類(lèi)對(duì)象:a,是子類(lèi)對(duì)象b的上轉(zhuǎn)型對(duì)象. 對(duì)象的上轉(zhuǎn)型對(duì)象的實(shí)體是子類(lèi)負(fù)責(zé)創(chuàng)建的,但上轉(zhuǎn)型對(duì)象會(huì)失去原子類(lèi)對(duì)象的一些屬性和功能。,上轉(zhuǎn)對(duì)象不能操作子類(lèi)新增的成員變量(失掉了這部分屬性);不能使用子類(lèi)新增的方法(失掉了一些功能)。 上轉(zhuǎn)型對(duì)象可以操作子類(lèi)繼承或隱藏成員變量,也可以使用子類(lèi)繼承的或重寫(xiě)的方法。 上轉(zhuǎn)型對(duì)象操作子類(lèi)繼承或重寫(xiě)的方法時(shí),就是通知對(duì)應(yīng)的子類(lèi)對(duì)象去調(diào)用這些方法。因此,如果子類(lèi)重寫(xiě)了父類(lèi)的某個(gè)方法后,對(duì)象的上轉(zhuǎn)型對(duì)象調(diào)用這個(gè)方法時(shí),一定是調(diào)用了這個(gè)重寫(xiě)的方法。 可以將對(duì)象的上轉(zhuǎn)型對(duì)象再?gòu)?qiáng)制轉(zhuǎn)換到一個(gè)子類(lèi)對(duì)象,這時(shí),該子類(lèi)對(duì)象又具備了子類(lèi)所有屬性和功能。 例3.19,對(duì)象的上轉(zhuǎn)型對(duì)象,3.11 多態(tài)性,多態(tài)性就是指父類(lèi)的某個(gè)方法被其子類(lèi)重寫(xiě)時(shí),可以各自產(chǎn)生自己的功能行為 . 當(dāng)一個(gè)類(lèi)有很多子類(lèi)時(shí),并且這些子類(lèi)都重寫(xiě)了父類(lèi)中的某個(gè)方法。那么當(dāng)我們把子類(lèi)創(chuàng)建的對(duì)象的引用放到一個(gè)父類(lèi)的對(duì)象中時(shí),就得到了該對(duì)象的一個(gè)上轉(zhuǎn)型對(duì)象,那么這個(gè)上轉(zhuǎn)的對(duì)象在調(diào)用這個(gè)方法時(shí)就可能具有多種形態(tài). 例3.20:用多態(tài)性實(shí)現(xiàn)不同動(dòng)物的叫聲。,1. abstract 類(lèi)和abstract方法,用關(guān)鍵字abstract修飾的類(lèi)稱(chēng)為abstract類(lèi)(抽象類(lèi)) abstract class A ,2. abstract類(lèi)的特點(diǎn),和普通的類(lèi)相比,abstract類(lèi)可以有abstract方法。對(duì)于abstract方法,只允許聲明,不允許實(shí)現(xiàn),而且不允許使用final修飾abstract方法。 abstract class A abstract int min(int x, int y); /抽象方法 int max(int x, int y) /普通方法 return x y ? x : y; ,對(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方法的原因。 一個(gè)abstract類(lèi)只關(guān)心它的子類(lèi)是否具有某種功能,并不關(guān)心功能的具體行為,功能的具體行為由子類(lèi)負(fù)責(zé)實(shí)現(xiàn),抽象類(lèi)中的抽象方法可以強(qiáng)制子類(lèi)必須給出這些方法的具體實(shí)現(xiàn)。 例2.21,2.22,3. abstract類(lèi)不能用new運(yùn)算創(chuàng)建對(duì)象,3.12 super關(guān)鍵字,子類(lèi)不繼承父類(lèi)的構(gòu)造方法,因此,子類(lèi)如果想使用父類(lèi)的構(gòu)造方法,必須在子類(lèi)的構(gòu)造方法中使用,并且必須使用關(guān)鍵字super來(lái)表示,而且super必須是子類(lèi)構(gòu)造方法中的頭一條語(yǔ)句。 如果我們?cè)谧宇?lèi)中想使用被子類(lèi)隱藏了的父類(lèi)的成員變量或方法就可以使用關(guān)鍵字super。比如:super.x、super.play(),就是被子類(lèi)隱藏的父類(lèi)的成員變量x和方法play()。 例2.23,2.24,3.13 接口(interface),Java不支持多繼承性,即一個(gè)類(lèi)只能有一個(gè)父類(lèi)。單繼承性使得Java簡(jiǎn)單,易于管理程序。為了克服單繼承的缺點(diǎn),Java使用了接口,一個(gè)類(lèi)可以實(shí)現(xiàn)多個(gè)接口。,1. 接口的聲明與使用,使用關(guān)鍵字interface來(lái)定義一個(gè)接口。接口的定義和類(lèi)的定義很相似,分為接口的聲明和接口體。 接口體中包含常量定義和方法定義兩部分。接口體中只進(jìn)行方法的聲明,不許提供方法的實(shí)現(xiàn),所以,方法的定義沒(méi)有方法體,且用分號(hào)“;”結(jié)尾。如: interface Printable final int MAX = 100; void add(); float sum(float x, float y); ,2. 接口的使用,一個(gè)類(lèi)通過(guò)使用關(guān)鍵字implements 聲明自己使用一個(gè)或多個(gè)接口。如果使用多個(gè)接口,用逗號(hào)隔開(kāi)接口名。如: class A implements Printable, Addable 如果一個(gè)類(lèi)使用了某個(gè)接口,那么這個(gè)類(lèi)必須實(shí)現(xiàn)該接口的所有方法,即為這些方法提供方法體 . 特別注意: 接口中的方法默認(rèn)的是public abstract方法,所以其實(shí)現(xiàn)類(lèi)給出的方法體一定要用public來(lái)修飾,而且接口中的常量默認(rèn)是public static常量,3. 理解接口,接口的思想在于它可以增加很多類(lèi)都需要實(shí)現(xiàn)的功能,使用相同的接口類(lèi)不一定有繼承關(guān)系. 同一個(gè)類(lèi)也可以實(shí)現(xiàn)多個(gè)接口。接口只關(guān)心功能,并不關(guān)心功能的具體實(shí)現(xiàn)。 例3.25,3.26,4. 接口回調(diào),接口回調(diào)是指:可以把實(shí)現(xiàn)某一接口的類(lèi)創(chuàng)建的對(duì)象的引用賦給該接口聲明的接口變量中。那么該接口變量就可以調(diào)用被類(lèi)實(shí)現(xiàn)的接口中的方法。 實(shí)際上,當(dāng)接口變量調(diào)用被類(lèi)實(shí)現(xiàn)的接口中的方法時(shí),就是通知相應(yīng)的對(duì)象調(diào)用接口的方法。 例3.27,3.28,5. 接口做參數(shù),一個(gè)方法的參數(shù)是接口類(lèi)型,就可以將任何實(shí)現(xiàn)該接口的類(lèi)的實(shí)例的引用傳遞給該接口參數(shù),接口參數(shù)就可以回調(diào)類(lèi)實(shí)現(xiàn)的接口方法。 例3.29,3.14 內(nèi)部類(lèi),Java支持在一個(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)。 內(nèi)部類(lèi)的類(lèi)體中不可以聲明類(lèi)變量和類(lèi)方法。外嵌類(lèi)的類(lèi)體中可以用內(nèi)部類(lèi)聲明對(duì)象,作為外嵌類(lèi)的成員。 例3.30,3.15 匿名類(lèi),和類(lèi)有關(guān)的匿名類(lèi) 當(dāng)使用類(lèi)創(chuàng)建對(duì)象時(shí),程序允許我們把類(lèi)體與對(duì)象的創(chuàng)建組合在一起,也就是說(shuō),類(lèi)創(chuàng)建對(duì)象時(shí),除了構(gòu)造方法還有類(lèi)體,此類(lèi)體被認(rèn)為是該類(lèi)的一個(gè)子類(lèi)去掉類(lèi)聲明后的類(lèi)體,稱(chēng)作匿名類(lèi)。 和接口有關(guān)的匿名類(lèi) Java允許直接用接口名和一個(gè)類(lèi)體創(chuàng)建一個(gè)匿名對(duì)象,此類(lèi)體被認(rèn)為是實(shí)現(xiàn)了接口的類(lèi)去掉類(lèi)聲明后的類(lèi)體,稱(chēng)作匿名類(lèi)。 例3.31,3.16 異常類(lèi),程序運(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(),使用trycatchfinally語(yǔ)句來(lái)處理異常,將可能出現(xiàn)的異常操作放在trycatch語(yǔ)句的try部分,當(dāng)try部分中的某個(gè)語(yǔ)句發(fā)生異常后,try部分將立刻結(jié)束執(zhí)行,而轉(zhuǎn)向執(zhí)行相應(yīng)的catch部分;所以程序可以將發(fā)生異常后的處理放在 catch部分。finally部分放的是無(wú)論是否出現(xiàn)異常都要執(zhí)行的語(yǔ)句。trycatch語(yǔ)句可以由幾個(gè)catch組成,分別處理發(fā)生的相應(yīng)異常。,1. 異常處理,trycatch語(yǔ)句的格式如下: try 包含可能發(fā)生異常的語(yǔ)句; catch(ExceptionSubClass1 e) 異常處理語(yǔ)句1; catch(ExceptionSubClass2 e) 異常處理語(yǔ)句2; finally 無(wú)論異常發(fā)生與否都要執(zhí)行的語(yǔ)句; 例3.33,2. trycatchfinally語(yǔ)句格式,用戶自定義的所有異常類(lèi)都必須是Exception的子類(lèi) public class MyException extends Exception . 一個(gè)方法在聲明是可以使用throws關(guān)鍵字聲明要產(chǎn)生的異常,并在該方法體中給出產(chǎn)生異常的操作 在程序中發(fā)現(xiàn)異常情況時(shí),可以拋出(throw)一個(gè)異常實(shí)例,將其放到異常隊(duì)列中去,并激活Java的異常處理機(jī)制,如:throw new MyException () 例3.34,3. 自定義異常類(lèi),3.18 Class類(lèi),Class是java.lang包中的類(lèi),該類(lèi)的實(shí)例用來(lái)封裝對(duì)象運(yùn)行時(shí)的狀態(tài)。 當(dāng)一個(gè)類(lèi)被加載且創(chuàng)建對(duì)象時(shí),和該類(lèi)相關(guān)的一個(gè)類(lèi)型為Calss的對(duì)象就會(huì)自動(dòng)創(chuàng)建。 Class類(lèi)本身不提供構(gòu)造方法,因此,不能使用new運(yùn)算符和構(gòu)造方法顯示地創(chuàng)建一個(gè)Class對(duì)象。,1、Class類(lèi)的使用,任何對(duì)象調(diào)用getClass()方法都可以獲取和該對(duì)象相關(guān)的一個(gè)Class對(duì)象,這個(gè)Class對(duì)象調(diào)用如下的方法可以獲取創(chuàng)建對(duì)象的類(lèi)的有關(guān)信息. String getName() /獲取類(lèi)名, Field getDeclaredFields() /獲取成員變量, Method getDeclaredMethods() /獲取成員方法, Constructor getDeclaredConstructors() /獲取構(gòu)造函數(shù) 例3.35,2. 使用Class實(shí)例化一個(gè)對(duì)象,創(chuàng)建對(duì)象最常用的方式就是使用new運(yùn)算符和類(lèi)的構(gòu)造方法,實(shí)際上也可以使用Class對(duì)象得到一個(gè)類(lèi)的實(shí)例。 為了得到一個(gè)類(lèi)的對(duì)象,可以先得到一個(gè)和該類(lèi)相關(guān)的Class對(duì)象,只要使用Class的類(lèi)方法 public static Class forName (String className) th

溫馨提示

  • 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)論