已閱讀5頁,還剩30頁未讀, 繼續(xù)免費閱讀
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
使用java實現(xiàn)面向?qū)ο缶幊痰?章 、抽象和封裝1.為什么使用面向?qū)ο?.面向?qū)ο缶褪遣捎谩艾F(xiàn)實模擬”的方法設(shè)計和開發(fā)程序。面向?qū)ο蠹夹g(shù)利用“面向?qū)ο蟮乃枷搿比ッ枋觥懊嫦驅(qū)ο蟮氖澜纭?,實現(xiàn)了虛擬世界和現(xiàn)實世界的一致性,符合人們的思維習(xí)慣,使客戶和軟件設(shè)計開發(fā)人員之間、軟件設(shè)計開發(fā)人員內(nèi)部交流更加順暢,同時有代碼重用性高、可靠性高等優(yōu)點,大大提高了軟件尤其是大型軟件的設(shè)計和開發(fā)效率。2.面向過程和面向?qū)ο笥惺裁磪^(qū)別?面向過程的核心是函數(shù),以功能為中心,實現(xiàn)了函數(shù)級別的代碼重用,面向?qū)ο蟮暮诵氖欠庋b了屬性和方法(行為)的類,以數(shù)據(jù)為中心,實現(xiàn)了類級別的代碼重用,面向?qū)ο笠驗椴捎昧祟?,所以具有繼承和多態(tài)特性,可以進一步重用代碼和簡化編程,而面向過程中沒有繼承和多態(tài)特性。2.使用面向?qū)ο筮M行程序設(shè)計1.面向?qū)Σ咴O(shè)計的過程就是抽象的過程,分為3個步驟來完成。第一步:發(fā)現(xiàn)類(一般為名詞)第二步:發(fā)現(xiàn)類的屬性(一般為名詞)第三步:發(fā)現(xiàn)類的方法(一般為動詞)2.抽象時遵循的原則如下:屬性、方法的設(shè)置是為了解決業(yè)務(wù)問題。關(guān)注主要屬性、方法、如沒有必要,勿增加額外的類、屬性和方法。通過創(chuàng)建對象實現(xiàn)領(lǐng)養(yǎng)寵物功能3.創(chuàng)建對象的三種方式:1、使用new關(guān)鍵字。2、反射。3、克隆。4.面向?qū)ο笾械膬蓚€核心概念:類(Class)和對象(Object)是面向?qū)ο笾械膬蓚€核心概念。類是對某一類事物的描述,是抽象的、概念上的定義。對象是實際存在的、具體的事物個體。5.類主要有屬性和行為組成:屬性和行為又稱為類的成員變量(或者成員屬性)和成員方法,統(tǒng)稱為類的成員(除此之外,類的成員還包括構(gòu)造方法、代碼塊等)6.常量:用來存儲不變的數(shù)據(jù),常量在程序運行過程中不會發(fā)生變化,只能被引用,不能被重新賦值,也就是值能在定義是修改其值。Java中的常量用final關(guān)鍵字修飾,并且常量名通常都大寫。為了方便調(diào)用,可以使用sstatic修飾,(推薦使用)。如:final String SEX_MALE=”Q仔”;final String SEX_FEMALE=”Q妹”;7.類名、屬性名、方法名以及常量名的命名規(guī)范:v 類名由一個或幾個單詞組成,每個單詞的第一個字母大寫,如:Dog、StringBufferv 屬性名和方法名由一個或幾個單詞組成,第一個單詞首字母小寫,其它單詞首字母大寫。v 如health、stuName、println() 、getMessage()。v 構(gòu)造方法名是唯一可以大寫的,如Penguin()。v 常量名有一個或者幾個單詞組成,所有字母大寫,如PISEX_MALE。常用的快捷鍵:封裝:Alt+Shift+S,R無參構(gòu)造方法:Alt+Shift+S,C有參構(gòu)造方法:Alt+Shift+S,O3.構(gòu)造方法及其重載1.構(gòu)造方法的特點和主要作用:特點就是,方法名和類名相同,沒有返回值。主要作用就是創(chuàng)建對象是執(zhí)行一些初始化操作,如給成員變量賦初值。2.構(gòu)造方法的重載:在同一個類中,方法名相同,參數(shù)列表不同。如下列,有參構(gòu)造方法中的示例:在使用this調(diào)用自身的其它構(gòu)造方法時,只能作為第一條語句。方法重載:如果同一個類中包含兩個或兩個以上的方法,它們的方法名相同,方法參數(shù)個數(shù)或參數(shù)類型不同,則稱該方法被重載了,這個過程稱為方法重載。方法重載的判斷依據(jù):v 必須在同一個類里。v 方法名相同。v 參數(shù)列表(方法參數(shù)的個數(shù)或參數(shù)類型)不同。v 與方法返回值和方法修飾符沒有任何關(guān)系。無參構(gòu)造方法:/* * 無參構(gòu)造方法 * */public Penguin() /加上返回值void的構(gòu)造方法不在是構(gòu)造方法了而是與構(gòu)造方法同名的成員方法name=男男;love=20;sex=Q妹;System.out.println(執(zhí)行構(gòu)造方法);有參構(gòu)造方法:/* * 兩個參數(shù)的構(gòu)造方法 */ public Penguin(String name,String sex) =name; this.sex=sex; /* * 四個參數(shù)的構(gòu)造方法 */ public Penguin(String name,int heath,int love,String sex) =name; this.heath=heath; this.love=love; this.sex=sex; 4.Static修飾符Static 可以用來修飾屬性、方法和代碼塊。static修飾的變量屬于這個類所有,即有這個類創(chuàng)建的所有對象共用同一個static變量。 屬性方法使用Static修飾類屬性(類變量)類方法不用static修飾實例屬性(實例變量)示例方法1.結(jié)論:v 在加載類的過程中,完成靜態(tài)變量的內(nèi)存分配,在執(zhí)行靜態(tài)塊,兩者是在創(chuàng)建對象之前執(zhí)行的。v 類屬性、類方法可以通過類名和對象名訪問,實例屬性、實例方法只能通過對象名訪問。v (靜態(tài)方法中不能使用this和super關(guān)鍵字。)v 類方法只能訪問類屬性和其他類方法。v 在方法里不可以定義static變量,也就是說,類變量不能是局部變量。5.封裝:封裝是面向?qū)ο蟮娜筇匦灾?,就是將類的狀態(tài)信息隱藏在類內(nèi)部,不允許外部程序直接訪問,而通過該類提供的方法實現(xiàn)對隱藏信息的操作和訪問。1.封裝的具體步驟:修改屬性的可見性來限制屬性的訪問;為每個屬性創(chuàng)建一對賦值(getter)和取值(setter)方法,用于對這些屬性的存??;在賦值方法中,加入屬性的存取控制語句。2.封裝的好處:隱藏類的實現(xiàn)細節(jié);讓使用著只能通過程序規(guī)定的方法來訪問數(shù)據(jù);可以方便地加入存取控制語句,限制不合理操作。修飾符的訪問權(quán)限同類子類同包不同包private默認(Friendly)protectedpublic3.This關(guān)鍵字:This關(guān)鍵字是對一個對象的默認引用。在每個實例方法內(nèi)部,都有一個this引用變量,指向調(diào)用這個方法的對象。This不能調(diào)用類變量和類方法,也不能調(diào)用局部變量。使用this調(diào)用成員變量,解決成員變量和局部變量的同名沖突。public Pet(String name)=name;/成員變量和局部變量同名,必須使用this使用this調(diào)用成員方法。public void play()health=health=n;this.print();/this可以省略,直接調(diào)用print();使用this調(diào)用重載的構(gòu)造方法,只能在構(gòu)造方法中使用,必須是構(gòu)造方法的第一條語句。 public Penguin(String name,int heath,int love,String sex) super(name,sex);/調(diào)用重載的構(gòu)造 this.heath=heath; this.love=love; 第2章 、繼承1.繼承(Inheritence)上一章中根據(jù)需求抽象出了Dog類和Penguin類,在這兩個類中有許多相同的屬性和方法,如Name、health和love屬性及相關(guān)的getter方法,還有print()方法。這樣設(shè)計的不足之處主要表現(xiàn)在兩方面:一是代碼重復(fù);二是如果要修改,則兩個類都要修改,如果涉及的類較多,修改量就很大,如果有效地解決這個問題呢?2. 其實我們只要把兩個類中相同的屬性和方法提取出來單獨放在一個類里面,保留住特有的屬性和方法;這就是需要繼承了。2.語法:修飾符 Subclass extends Superclass/類定義部分通過extends關(guān)鍵字來實現(xiàn),其中的Subclass稱為子類,SuperClass稱為父類、基類或超類。修飾父如果public,則該類在整個項目中可見;若無public修飾則該類只在當(dāng)前包可見;不可以使用private和protected修飾類繼承是面向?qū)ο蟮娜筇匦灾?,是Java中實現(xiàn)代碼重用的重要手段之一。Java中只支持單繼承,即每個類只能有一個直父類。繼承表達的是is a 的關(guān)系?;蛘哒f是一種特殊和一般的關(guān)系,如Dog is a Pet。在Java中,所有的Java類都直接或間接地繼承Java.lang.Object類。Object類是Java類的祖先。在定義一個類時,如果沒有使用extends關(guān)鍵字,那么這個類直接繼承Object類。3.Java.lang.Object類的方法修飾符的訪問權(quán)限本類子類同包其他private默認(Friendly)protectedpublic2.重寫和繼承關(guān)系中的構(gòu)造方法1.子類重寫父類方法1.在子類的構(gòu)造方法執(zhí)行前,必須先執(zhí)行父類的構(gòu)造方法。v 如果父類沒有無參構(gòu)造方法,子類必須指定調(diào)用其他構(gòu)造方法v 默認總是調(diào)用父類的無參構(gòu)造方法。v 所以,如果父類沒有提供無參構(gòu)造方法,那么程序員必須手動的根據(jù)需要在代碼中顯式調(diào)用父類的某個帶參的構(gòu)造方法。(調(diào)用必須寫在第一句)2.方法的重寫在子類中可以根據(jù)需求對從父類的方法進行重新編寫,稱為方法的重寫或方法的覆蓋(overriding)。方法重寫必須滿足的要求:重寫方法和被重寫方法必須具有相同的方法名。重寫方法和重寫方法必須具有相同的參數(shù)列表。重寫方法的返回值類型必須和被重寫方法的返回值類型相同或是其子類。重寫方法不能縮小被重寫方法的訪問權(quán)限。3.重載和重寫的區(qū)別和聯(lián)系:重載涉及同一個類中的同名方法,要求方法名相同,參數(shù)列表不同,與返回值類型、訪問修飾符無關(guān)。重寫涉及的是子類和父類之間的同名方法,要求方法名相、參數(shù)列表相同、返回值類型相同(或是其子類)、訪問修飾符不能嚴于父類。4.Super的使用super代表對當(dāng)前對象的直接父類的默認引用。在子類中可以通過super關(guān)鍵字訪問父類的成員。Super必須出現(xiàn)在子類(子類的方法和構(gòu)造方法)中,而不是其他位置??梢栽L問父類的成員,如父類的屬性、方法、構(gòu)造方法。注意訪問權(quán)限的限制,如無法通過super訪問private成員。例如,在Dog類中可以通過如下語句來訪問父類成員(以下父類成員和構(gòu)造方法都不是private權(quán)限)。S;/訪問直接父類的name屬性Super/print();/訪問直接父類的print()方法Super(name);/訪問直接父類的對應(yīng)構(gòu)造方法,只能出現(xiàn)在構(gòu)造方法中3.繼承關(guān)系中的構(gòu)造方法1.繼承條件下構(gòu)造方法的調(diào)用規(guī)則。v 如果子類的構(gòu)造方法中沒有通過super顯示調(diào)用父類的有參構(gòu)造方法,也沒有通過this顯示調(diào)用自身的其他構(gòu)造方法,則系統(tǒng)會默認調(diào)用父類的無參構(gòu)造方法。在這種情況下,有沒有”super()”;語句,效果都是一樣的。v 如果子類的構(gòu)造方法中通過super顯示調(diào)用父類的有參構(gòu)造方法,則在相應(yīng)構(gòu)造方法中應(yīng)用以上兩條規(guī)則。v 特別注意的是,如果存在多級關(guān)系,則在創(chuàng)建一個子類對像時,以上規(guī)則會多次向更高一級父類應(yīng)用,一直執(zhí)行頂級父類Object類的無參構(gòu)造方法為止。v 在構(gòu)造方法中付過有this語句或super語句出現(xiàn),則只能是第一條語句。v 在一個構(gòu)造方法中不允許同時出現(xiàn)使用this和super語句調(diào)用構(gòu)造方法(否則就有兩條第一條語句)。v 在類的方法中不允許出現(xiàn)this或super關(guān)鍵字。v 在示例方法中,this和super語句不要求是第一條語句,可以共存。2. 繼承關(guān)系中構(gòu)造方法的執(zhí)行順序4.抽象類1.抽象類和抽象方法的特點(1) 抽象類和抽象分都通過abstract關(guān)鍵字來修飾。(2) 抽象類不能實例化。抽象類中可以沒有、有一個或者多個抽象方法,甚至全部都可以是抽象方法。(3) 抽象方法只有方法聲明,沒有方法實現(xiàn)。有抽象方法的類必須聲明為抽象類。子類必須重新所有抽象方法才能實例化,否則子類還是一個抽象類。抽象類:public abstract class Pet /抽象方法/屬性問題:抽象類可有構(gòu)造方法嗎?解答:抽象類可以有構(gòu)造方法,其構(gòu)造方法可以被本類的其他構(gòu)造方法調(diào)用,若此構(gòu)造方法不是有private修飾,也可以被本類的子類中類構(gòu)造方法調(diào)用。5.Final 修飾符1.Final 的應(yīng)用(1)、用final 修飾類,不能再被繼承,如以下代碼所示。Final class penguinClass SubPenguin extends Penguin/此行出現(xiàn)錯誤(2)、用final修飾符的方法不能被子類重寫,如:Class penguinPublic final void print()提示錯誤:The type SubPenguin cannot subclass the final class,即Penguin類不能被繼承。Class SubPenguin extends PenguinPublic void print()/此行出現(xiàn)錯誤提示錯誤:cannot override the final method from Penguin ,即print()方法不能被子類重寫。(3)、用final修飾的變量(包括成員變量和局部變量)將變成常量,只能賦值一次,如:Public class penguinFinal String home=”南極”;/居住地Public void setHome(String name)This.home=home;/錯誤,home不可以再次賦值提示錯誤:The final filed Penguin.home cannot be assigned,即不可以再次賦值。2.final和abstract的區(qū)別v final 和abstract是功能相反的兩個關(guān)鍵字,可以對比記憶。v abstract可以用來修飾類和方法,不能用來修飾屬性和構(gòu)造方法。Final可以用來修飾類、方法和屬性,不能修飾構(gòu)造方法。v Java 提供的很多類都是final類,如String 類、Math類,它們不能再有子類。Object類中一些方法,如getClass()、notify()、wait()都是final方法,只能被繼承而不能被重寫,但是hashCode()、toString()、equals(Object obj)不是final方法,可以重寫。使用final修飾引用型變量時,變量的值時固定不變的,而變量所指向的對象屬性值時可變的。(2)abstract是否可以和private、static、final共用?(1) abstract不能和private同時修飾一個方法。(2) abstract不能和static同時修飾一個方法。(3) abstract不能和final同時修飾一個方法或類。第3章 、多態(tài)1.什么是多態(tài)多態(tài)(polymorphism)是具有多種形態(tài)的能力的特征。(同一個實現(xiàn)接口,使用不同的實例執(zhí)行不同的操作。)(其核心是重寫,核心機制是動態(tài)綁定)子類到父類的轉(zhuǎn)型(向上轉(zhuǎn)型)在引用數(shù)據(jù)類型的子類和父類之間也存在著轉(zhuǎn)換問題,Dog dog=new Dog(“歐歐”,”雪麗娜”);/不涉及類型轉(zhuǎn)換Dog.eat();Pet pet=new Dog(“歐歐”,”雪麗娜”);/子類到父類的轉(zhuǎn)換 Pet.eat();/會調(diào)用dog類重寫eat()方法,而不是Pet類的eat()方法Pet.catchingFlyDisc();/編譯錯誤,父類的引用無法調(diào)用類特有的方法v 將一個父類的引用指向一個子類對象,稱為向上轉(zhuǎn)型(upcasting),自動進行類型轉(zhuǎn)換。v 此時通過父類引用變量調(diào)用的方法是子類覆蓋或繼承的方法,不是父類的方法。v 此時通過父類引用變量無法調(diào)用子類特有的方法。2.使用父類作為方法形參實現(xiàn)多態(tài)是Java中實現(xiàn)和使用多態(tài)的主要方法之一。/* * 主人給Dog喂食 */public void feed (Dog dog)dog.eat();/* * 主人給Penguin喂食 */public void feed(Penguin pgn)pgn.eat();多態(tài)的明顯優(yōu)勢:可以減少代碼量,提高代碼的可擴展性和可維護性。3.使用父類作為方法返回值實現(xiàn)多態(tài)是Java中實現(xiàn)和使用多態(tài)的另一種方式。public class Master private String name =;/主人名字private int money=0;/元寶數(shù)public Master(String name ,int money)=name;this.money=money; public void feed(Pet pet)pet.eat();public Pet getPet(int typeId)Pet pet=null;if(typeId=1)pet=new Dog(歐歐,雪娜瑞);else if(typeId=2)pet=new Penguin(楠楠,Q妹);return pet;1.總結(jié):v 繼承的存在(繼承是多態(tài)的基礎(chǔ),沒有繼承就沒有多態(tài))。v 子類重寫父類的方法(多態(tài)下調(diào)用子類重寫后的方法)。v 父類引用變量指向子類對象(子類到父類的類型轉(zhuǎn)換)。4.父類到子類的轉(zhuǎn)換(向下轉(zhuǎn)型)父類到子的轉(zhuǎn)換。同時,會使用instanceof運算符來判斷對象的類型。將一個指向子類對象的父類引用賦給一個子類的引用,稱為向下轉(zhuǎn)型,此時必須進行強制類型轉(zhuǎn)換。調(diào)用不同的寵物子類對象的特有方法,在預(yù)編譯階段,虛擬機對引用采用靜態(tài)綁定,沒有辦法動態(tài)獲取到子類中特有的方法。public class Test / public static void main(String args) Pet pet =new Dog(歐歐,雪娜瑞);/Pet pet=new Penguin(楠楠,Q妹);pet.eat();/pet.catchingFlyDisc();/編譯錯誤,無法調(diào)用子類特有的方法if(pet instanceof Dog)Dog dog=(Dog) pet;/強制類型轉(zhuǎn)換成狗對象dog.catchingFlyDisc();/調(diào)用狗狗玩飛盤else if(pet instanceof Penguin)Penguin pgn=(Penguin)pet;/強制類型轉(zhuǎn)換成企鵝對象pgn.swimming();/調(diào)用企鵝游泳1.將出現(xiàn)ClassCastException異常?;緮?shù)據(jù)類型之間進行強制性轉(zhuǎn)換是對把=被強制轉(zhuǎn)換類型”做手術(shù)”,如:Doublie dl=5:/對5”做手術(shù)”,變成5.0Int a =(int )3.14;/歲3.14做手術(shù),變成3引用類型之間強制轉(zhuǎn)換時是還原類的真正面目,而不是給子類“做手術(shù)”。Pet pet=new Dog(“歐歐”,”雪娜瑞”);Dog dog =(Dog)pet;/正確!還原子類的真實面目Penguin pgn =(Penguin)pet;/出現(xiàn)異常!給子類“做手術(shù)”5.Instanceof運算符1.語法:對象 instanceof 類或接口該運算符用來判斷一個對象是否屬于一個類或者實現(xiàn)了一個接口,結(jié)果為true或者false。在強制類型轉(zhuǎn)換之間通過instanceof運算符檢查對象的真實類型,在進行相應(yīng)的強制類型轉(zhuǎn)換,這樣就可以避免類型轉(zhuǎn)換異常,從而提高代碼的健壯性。Pet pet =new Dog(歐歐,雪娜瑞);/Pet pet=new Penguin(楠楠,Q妹);pet.eat();/pet.catchingFlyDisc();/編譯錯誤,無法調(diào)用子類特有的方法if(pet instanceof Dog)Dog dog=(Dog) pet;/強制類型轉(zhuǎn)換成狗對象dog.catchingFlyDisc();/調(diào)用狗狗玩飛盤else if(pet instanceof Penguin)Penguin pgn=(Penguin)pet;/強制類型轉(zhuǎn)換成企鵝對象pgn.swimming();/調(diào)用企鵝游泳v 使用instanceof運算符時,對象的類型必須和instanceof的第二個參數(shù)所指的類或接口在繼承樹上有上下級關(guān)系,否則會出現(xiàn)編譯錯誤。例如,pet instanceof String 會出現(xiàn)編譯錯誤。v Instanceof 通常和強制類型轉(zhuǎn)換結(jié)合使用。第4章 、接口為什么需要接口第一,繼承中必須符合is a 的關(guān)系;第二,Java只支持單繼承。什么是接口接口是一種規(guī)范和標(biāo)準,它們可以約束類的行為,是一些方法特征的集合,但是沒有方法的實現(xiàn)。(接口可以看作是一種特殊的“抽象類”)抽象類利于代碼復(fù)用,接口利于代碼的擴展和維護。語法:修飾符 interface 接口名 父接口1:父接口2,./常量定義/方法定義實現(xiàn)語法:Class 類名 extends 父類名 implements 接口1,接口2,.類成員v 接口的命名規(guī)則與類相同。如果修飾符是public ,則該接口在整個項目總可見;如果省略修飾符,則該接口值在當(dāng)前包可見。v 接口中可以定義常量,不能定義常量。接口中的屬性都會自動用public static final修飾,v 即接口中的屬性都是全局靜態(tài)常量。接口中的常量必須在定義是指定初始值。Public static final int PI=3.14;Int PI=3.14;/在接口中,這兩個定義語句效果完全相同Int PI;/錯誤!在接口中必須指定初始值,在類中會默認有默認值v 接口中所有方法都是抽象方法。接口中都會自動用public abstract 修飾,即接口中只有全局抽象方法。v 和抽象類一樣,接口也不能實例化,接口中不能有構(gòu)造方法。v 接口之間通過extends實現(xiàn)繼承關(guān)系,一個接口可以繼承多個接口,但接口不能繼承類。v 接口的實現(xiàn)類必須實現(xiàn)接口的全部方法,否則必須定義為抽象類。v 一個類只能有一個直接父類,但可以通過implements實現(xiàn)接口。當(dāng)類在繼承父類的同時又實現(xiàn)多個接口時,extends關(guān)鍵字必須位于implements關(guān)鍵字之前。特性:1. 接口不可以實例化2. 實現(xiàn)類必須實現(xiàn)接口的所有方法。3. 實現(xiàn)類可以實現(xiàn)多個接口4. 接口中的變量都是靜態(tài)常量。接口的概念相當(dāng)于現(xiàn)實世界中的規(guī)范或者契約。接口表示一種能力一個類實現(xiàn)了某個接口,就表示這個類具備了某種能力。有些接口只有方法名稱,接口比抽象類更好的特性1. 可以多繼承2. 設(shè)計和實現(xiàn)完全分離,3. 更自然的使用多態(tài)4. 更容易搭建程序框架5. 更容易更換實現(xiàn)接口表示一種約定在面向?qū)ο缶幊讨刑岢嫦蚪涌诰幊蹋皇敲嫦驅(qū)崿F(xiàn)編程。接口體現(xiàn)了約定和實現(xiàn)分離的原則,通過面向接口編程,可以降低代碼間的耦合性,提高代碼的可擴展性和可維護性。面向接口就意味著:開發(fā)系統(tǒng)是,主體構(gòu)架使用接口,接口構(gòu)成系統(tǒng)的骨架,這樣就可以通過更換接口的類來實現(xiàn)更換系統(tǒng)。經(jīng)驗:面向接口編程可以實現(xiàn)接口和實現(xiàn)的分離,這樣做最大的好處就是能夠在客戶端未知的情況下修改實現(xiàn)代碼。那么怎樣抽象出接口呢?一種是用在層和層之間的調(diào)用。層和層之間最忌諱耦合度過高或修改過于頻繁。設(shè)計優(yōu)秀的接口能夠解決這個問題。另一種使用在那些不穩(wěn)定的部分上,如果某些需求的變化性很大,那么定義接口也是一種解決方法。設(shè)計良好的接口就像日常使用的萬能插座,不論插頭如何變化,都可以使用。最后強調(diào)一點,良好的接口定義來自于需求的,它絕對不是程序員絞盡腦汁想出來的。第5章 、項目案例:QuickHit第6章 、異常異常就是在程序的運行過程中所發(fā)生的不正常的事件。異常處理異常處理機制就像我們對平時可能遇到的意外情況,預(yù)先想好了一些處理辦法。也就是說,在程序執(zhí)行代碼的時候,萬一遇到了異常,程序會按照預(yù)定的處理辦法對異常進行處理,異常處理完畢后,程序會繼續(xù)運行。Java異常處理是通過5個關(guān)鍵字來實現(xiàn)的:try、catch、finally、throw和throws。Try-catch塊v 如果try塊中所有語句正常執(zhí)行完畢,不會發(fā)生異常,那么catch塊中的所有語句都將會被忽略。v 如果try語句塊在執(zhí)行過程中遇到異常,并且這個異常與catch中申明的異常類型相匹配,那么在try塊中其余剩下的代碼都將被忽略,而相應(yīng)的catch塊將會被執(zhí)行。v 在catch塊中可以加入用戶自定義處理信息,也可以調(diào)用異常對象的方法輸出異常信息,常用的方法主要有以下兩種。n Void printStackTrace(); 輸出異常堆棧信息。堆棧信息包括程序運行到當(dāng)前類的執(zhí)行流程,它將輸出從方法調(diào)用處到異常拋出的方法調(diào)用序列,n String getMessage();返回異常信息描述字符串。該字符串描述異常產(chǎn)生的原因,是print輸出信息的一部分。如果try塊在執(zhí)行過程中遇到異常,那么在try塊中其余剩下的代碼都將會被忽略,系統(tǒng)自動生成相應(yīng)的異常對象,包括異常的類型、異常出現(xiàn)時程序的運行狀態(tài)及對該異常的詳細描述。如果這個異常對象與catch中申明的異常類型相匹配,會把該異常對象賦給catch后面的異常參數(shù),相應(yīng)的catch塊將會被執(zhí)行。常見異常類型異常說明Exception異常層次結(jié)構(gòu)的根類ArithmeticException算術(shù)錯誤情形,如以零作除數(shù)ArrayIndexOutOfBoundsException數(shù)組下標(biāo)越界NullPointerException嘗試訪問null對象成員ClassNotFoundException不能加載所需的類InputMismatchException欲得到的數(shù)據(jù)類型與實際輸入的類型不匹配IllegalArgumentException方法接收到非法參數(shù)ClassCastException對象強制類型轉(zhuǎn)換出錯NumberFormatException數(shù)字格式轉(zhuǎn)換異常,如果“abc”轉(zhuǎn)換成數(shù)字Try-catch-finally塊v 如果try塊中所有語句正常執(zhí)行完畢,那么finally塊就會被執(zhí)行。v 如果try語句塊在執(zhí)行過程中碰到異常,無論這種異常能否被catch塊捕獲到、都將執(zhí)行finally塊中的代碼。v Try-catch-finally結(jié)構(gòu)中try 塊是必需的,catch和finally塊為可選,但兩者至少須出現(xiàn)其中之一。v 需要特別注意的是,即使在try 塊和catch塊中存在return語句,finally塊中語句也會被執(zhí)行。v 發(fā)生異常時的順序:執(zhí)行try塊或catch中return之前的語句,先執(zhí)行finally塊中的語句,在執(zhí)行try塊catch中return語句退出。v Finally塊中語句不被執(zhí)行的唯一情況:在異常處理代碼中執(zhí)行System.exit(1),將退出java虛擬機。多重catch運行時,系統(tǒng)從上到下分別對每個catch語句塊處理的異常類型進行檢查,并執(zhí)行第一個與異常類型匹配的catch語句。執(zhí)行其中的一catch語句之后,其后的catch語句 都將被忽略。但是排列順序必須是從子類到父類,最后一個一般都是Exception類。因為所有異常子類都繼承自Exception類,所以如果將父類異常放到前面,那么所有的異常都被捕獲,后面的catch塊匯總的子類異常將得不到被執(zhí)行的機會。public class Test4 private static Logger logger=Logger.getLogger(Test4.class.getName();public static void main(String args) / TODO Auto-generated method stubtry Scanner in = new Scanner(System.in);System.out.print(請輸入被除數(shù):);int num1 = in.nextInt();(輸入被除數(shù):+num1);System.out.print(請輸入除數(shù):);int num2 = in.nextInt();(輸入除數(shù):+num2);System.out.println(String.format(%d/%d=%d, num1, num2, num1/ num2);/ 格式化輸出(輸出結(jié)果:+String.format(%d/%d=%d, num1, num2, num1/ num2);catch (InputMismatchException e) logger.error(輸入了非整數(shù)+e); catch (ArithmeticException e) logger.warn(除數(shù)不能為零+e); catch (Exception e) finally System.out.println(感謝使用本程序!);聲明異常throwsJava語句中通過關(guān)鍵字throws聲明某個方法可能拋出的各種異常。throws可以同時聲明多個異常,之間用逗號隔開。通過try-catch捕獲并處理異常。通過throws繼續(xù)聲明異常。如果調(diào)用者不打算處理異常,可以繼續(xù)通過throws聲明異常,讓上一級調(diào)用者處理異常。main()方法聲明的異常將有java虛擬機來處理。public class Test public static void foo(int i) throws Exception /聲明異常try if(i=1)throw new Exception(); catch (NullPointerException e) System.out.println(2);finallySystem.out.println(3);System.out.println(4);拋出異常throw在java語言中,可以使用throw關(guān)鍵字來自行拋出異常。(代表一種設(shè)計意圖)public class Person private String name=;/姓名private int age =0;/年齡/* * 年齡限制 * param age * throws Exception */public void setAge(int age) throws Exception if(age0&ageerrorwarninfodebug2. 日志輸出目的地Appender log4j.rootLogger=info,stdout,logfileStdout、logfile指的是輸出目的地的名字。最常用的Appender有以下兩種。ConsoleAppender:輸出日志事件到控制。通過Target屬性配置輸出到System.out或者System.err,默認的目標(biāo)是System.out.FileAppender:輸出日志事件到一個文件。通過File屬性配置文件的路徑及名稱。3. 日志布局類型LayoutAppender必須使用一個與之相關(guān)聯(lián)的布局類型Layout,用來指定它的輸出樣式。HTMLLayout:格式化日志輸出為HTML表格。SimpleLayout:以一種非常簡單的方式格式化日志輸出,它輸出級別Level,然后跟著一個波折號“”,最后是日志消息。PatternLayout:根據(jù)指定的轉(zhuǎn)換模式格式化日志輸出,從而支持豐富多樣的輸出格式。4. 轉(zhuǎn)換模式ConversationPattern%d:用來設(shè)置輸出日志的日期和時間,默認格式為ISO8601,也可以在其后指定器格式。%m:用來輸出代碼中指定的消息。%n:用來輸出一個回車換行符。%l:用來輸出日志事件的發(fā)生位置,包括類名,發(fā)生的線程,以及在代碼中的行數(shù)。%p:用來輸出優(yōu)先級,%F:用來輸出文件名。%M:用來輸出方法名。#設(shè)置Logger輸出級別和輸出目的地#把日志信息輸出到文件#log4j.appender.logfile=org.apache.log4j.FileAppenderlog4j.appender.logfile.File=jbit.loglog4j.appender.logfile.layout=org.apache.log4j.PatternLayoutlog4j.appender.logfile.layout.ConversionPattern=%d %p %F %M %m %n第七章、集合框架 1.集合框架概述引入集合框架(安全、高效、方便統(tǒng)一)集合只能存對象,不能存基本數(shù)據(jù)類型。集合框架包含的內(nèi)容集合框架都包含三大塊內(nèi)容:對外接口、接口的實現(xiàn)對集合運算的算法。接口:表示集合的抽象數(shù)據(jù)類型,如:Collection、List、Set、Map、Iterator。實現(xiàn):集合框架中接口的具體實現(xiàn),如:ArrayList、LinkedList、HashMap、HashSet。算法:在一個實現(xiàn)了某個集合框架的接口的對象身上完成某種有用的計算的方法,如查找、排序等。Java提供了進行集合操作的工具類Collections,她提供了對集合進行操作排序的等多種算法和實現(xiàn)類。Java集合框架中的兩大接口:Collection和Map,其中Collection又有兩個子接口:List和Set。所說的java集合框架共有3大接口:List、Set、Map。它們的共同點:都是集合接口,都可以用來存儲很多對象。Collection接口存儲一組唯一(允許重復(fù))、無序的對象。Set接口繼承Collection接口,存儲一組唯一(不允許重復(fù))、無序?qū)ο?。List接口繼承Collection接口,存儲一組不為一(允許重復(fù))、有序(以元素插入的次數(shù)來放置元素,不會重新排序)的對象。Map接口存儲一組成對的鍵值對象,提供key(鍵)到value(值)的映射。Map中的key不要求有序,不允許重復(fù)。Value同樣不要求有序,但允許重復(fù)。Iterator接口是負責(zé)定義訪問和遍歷元素的接口。01234AaaaDdddCcccEeeeDdddList集合示意圖List接口實現(xiàn)List接口的常用類有ArrayList和LinkedList。它們都可以容納所有類型的對象,包括null,允許重復(fù),并且都保證元素的存儲順序。ArrayList對數(shù)組進行了封裝,實現(xiàn)了長度可變的數(shù)組。ArrayList存儲數(shù)據(jù)的方式和數(shù)組相同,都是在內(nèi)存中分配連續(xù)的空間,它的優(yōu)點在于遍歷元素和隨機訪問元素的效率比較高。刪除和新增的效率較低。01234AaaaDdddCcccEeeeDdddArrayList存儲方式示意圖LinkedList采用鏈存儲方式,優(yōu)點在于插入、刪除元素時的效率比較高。它提供了額外的addFirst()、addLast()、removeFirst()和removeLast()等方法,可以LinkedList的首尾進行插入或刪除操作。這些方法使得LinkedList可被用作堆(stack)或者隊列(queue)。LinkedList存儲方式:在兩端記錄下上一個元素和下一個元素的地址2.ArrayList集合類import java.util.ArrayList;import java.util.Iterator;import java.util.List;/* * 測試Arrylist的add()、size()、get()方法 * author Administrator */public
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年版高校專利技術(shù)轉(zhuǎn)讓合同
- 2024-2030年中國大棗飲料行業(yè)銷售模式及投資盈利預(yù)測報告
- 2024-2030年中國城市電視臺行業(yè)發(fā)展策略及投資運作模式分析報告
- 2024年農(nóng)業(yè)產(chǎn)業(yè)投資合同擔(dān)保協(xié)議3篇
- 2024年校園水電設(shè)施改造與維護服務(wù)合同3篇
- 馬鞍山師范高等??茖W(xué)?!段锫?lián)網(wǎng)應(yīng)用概論》2023-2024學(xué)年第一學(xué)期期末試卷
- 2024年創(chuàng)新創(chuàng)業(yè)項目投資評估與咨詢服務(wù)協(xié)議3篇
- 2024年度自動駕駛汽車勞動合同與聘用合同3篇
- 2024年標(biāo)準化信息技術(shù)外包服務(wù)合同一
- 2024年度行政合同科技創(chuàng)新合同糾紛救濟與保障協(xié)議2篇
- 機器學(xué)習(xí)(山東聯(lián)盟)智慧樹知到期末考試答案章節(jié)答案2024年山東財經(jīng)大學(xué)
- 德勤公司概況簡介
- DB32∕T 2156-2012 電梯能耗測試及能效分級
- 瀝青路面日常養(yǎng)護及維修施工要點(大量附圖共143頁)
- 《色彩基礎(chǔ)知識》PPT課件(詳解)
- 《保健按摩師》(二級)理論知識鑒定要素細目表
- 甘蔗制糖簡介
- 三秦出版社五年級上冊綜合實踐教案
- 屋頂分布式光伏項目安全文明施工控制措施
- 水泥保證供應(yīng)實施方案及服務(wù)承諾書
- 2022機要密碼工作總結(jié)機要室工作總結(jié).doc
評論
0/150
提交評論