CH03Java面向?qū)ο蟪绦蛟O(shè)計.ppt_第1頁
CH03Java面向?qū)ο蟪绦蛟O(shè)計.ppt_第2頁
CH03Java面向?qū)ο蟪绦蛟O(shè)計.ppt_第3頁
CH03Java面向?qū)ο蟪绦蛟O(shè)計.ppt_第4頁
CH03Java面向?qū)ο蟪绦蛟O(shè)計.ppt_第5頁
已閱讀5頁,還剩69頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

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

溫馨提示

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

評論

0/150

提交評論