面向?qū)ο蠡A(chǔ)(下)課件_第1頁(yè)
面向?qū)ο蠡A(chǔ)(下)課件_第2頁(yè)
面向?qū)ο蠡A(chǔ)(下)課件_第3頁(yè)
面向?qū)ο蠡A(chǔ)(下)課件_第4頁(yè)
面向?qū)ο蠡A(chǔ)(下)課件_第5頁(yè)
已閱讀5頁(yè),還剩101頁(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)介

面向?qū)ο蠡A(chǔ)(下)第4章面向?qū)ο蟪绦蛟O(shè)計(jì)(下)一.類的繼承

1.繼承機(jī)制:在面向?qū)ο缶幊汤?,可以根?jù)已定義的類定義一個(gè)新類,從而實(shí)現(xiàn)代碼的復(fù)用。其中,被繼承的類稱父類,由繼承而得到的類稱子類。子類具有父類的成員(屬性和方法),同時(shí)也可以修改父類的屬性或重寫父類的方法,并增加新的屬性和方法。

2.繼承通過(guò)entends關(guān)鍵字實(shí)現(xiàn)。這種關(guān)系也叫做“is”關(guān)系:

classAextendsB,

A(子類)isaB(父類)

例:classEmployee{ publicStringname=“”; publicdoublesalary; publicDatebirthDate; publicStringgetDetails(){…}}

publicclassManager{publicStringname=“”;publicdoublesalary;publicDatebirthDate;publicStringdepartment;

publicStringgetDetails(){

…}}publicclassManagerextendsEmployee{ publicStringdepartment;}完整代碼如下:publicclassEmployee{publicStringname;publicintage;publicEmployee(Stringname,intage){=name;

this.age=age;}publicEmployee(){}publicStringgetInfo(){System.out.println(name); System.out.println(age);}}classManagerextendsEmployee{ publicvoidmanage() { System.out.println("managing"); } publicstaticvoidmain(String[]args) { Employeep=newEmployee(); ="Employee";p.age=30; p.getInfo(); Managerm=newManager(); ="Manager";m.getInfo();m.manage(); }}

要在以前的類的基礎(chǔ)上構(gòu)造新類,必須在新類的聲明中擴(kuò)展以前的類,通過(guò)擴(kuò)展一個(gè)超類,可以得到這個(gè)類的一個(gè)備份,并在這個(gè)基礎(chǔ)上,添加新的屬性和方法。如果對(duì)新類不作任何添加工作,那它的工作情況會(huì)與超類完全相同。新類中會(huì)含有超類所聲明或繼承的所有屬性和方法。在類的繼承中會(huì)有以下一些細(xì)節(jié)問(wèn)題應(yīng)注意:

(1)通過(guò)類的繼承可以簡(jiǎn)化類的定義。

(2)java只支持單繼承,不允許多重繼承。在 java中,一個(gè)子類只能由一個(gè)父類,但一 個(gè)類可以被多個(gè)類繼承。

(3)可以有多層繼承,即一個(gè)類可以繼承某一 個(gè)類的子類,即間接繼承。如:classA{

}ClassBextendsA{}ClassCextendsB{}(4)子類繼承父類的所有成員變量和成員方法,但不繼承父類的構(gòu)造方法,在子類的構(gòu)造方法中,可以使用語(yǔ)句super(參數(shù)列表)調(diào)用父類的構(gòu)造方法。如:我們?yōu)镸anager類增加一個(gè)構(gòu)造方法,在這個(gè)構(gòu)造方法中用super明確指定調(diào)用父類的某個(gè)構(gòu)造方法。

classManagerextendsEmployee{ publicManager(Stringname,intage,Stringcompany) { this(name,age);pany=company; } }(5)如果子類構(gòu)造方法中沒(méi)有顯式調(diào)用父類的構(gòu)造方法,也沒(méi)有使用this關(guān)鍵字調(diào)用重載的本類的其它構(gòu)造方法,則在產(chǎn)生子類的實(shí)例對(duì)象時(shí),系統(tǒng)默認(rèn)調(diào)用父類無(wú)參的構(gòu)造方法。在下面的類B中,定義的構(gòu)造方法中,寫不寫super()語(yǔ)句的效果是一樣的。

classBextendsA{publicB(){super();}}(1)分配成員變量的存貯空間并進(jìn)行默認(rèn)的初始化,就是用new關(guān)鍵字產(chǎn)生對(duì)象后,對(duì)類中的成員變量按系統(tǒng)默認(rèn)的值進(jìn)行初始化賦值。3.子類對(duì)象的實(shí)例化過(guò)程

對(duì)象中的成員變量的初始化是按下述步驟進(jìn)行的:(2)綁定構(gòu)造方法,就是用new(實(shí)參列表)所傳遞進(jìn)的參數(shù)賦值給構(gòu)造方法中的形式參數(shù)。

(3)如果有this調(diào)用,則調(diào)用相應(yīng)的重載構(gòu)造方法(被調(diào)用的重載構(gòu)造方法又從步驟2開始執(zhí)行這些流程),被調(diào)用的重載構(gòu)造方法的執(zhí)行流程結(jié)束后,回到當(dāng)前構(gòu)造方法,當(dāng)前構(gòu)造方法直接跳轉(zhuǎn)到(6)去執(zhí)行。

(4)顯式或隱式追溯調(diào)用父類的構(gòu)造方法(一直到Object類為止,Object類是所有java類的最頂層父類),父類的構(gòu)造方法又從步驟(2)開始對(duì)父類執(zhí)行這些流程,父類的構(gòu)造方法的執(zhí)行流程結(jié)束后,回到當(dāng)前構(gòu)造方法,當(dāng)前構(gòu)造方法繼續(xù)往下執(zhí)行。(5)進(jìn)行實(shí)例變量的顯式初始化,也就是執(zhí)行在定義成員變量時(shí)就對(duì)其進(jìn)行的賦值語(yǔ)句,如:classManagerextendsEmployee{Stringcompany=“sun公司”;......}(6)執(zhí)行當(dāng)前構(gòu)造方法體中的程序代碼,如:classManagerextendsEmployee{Stringcompany=“sun公司”;

publicManager(Stringname,intage,Stringcompany){super(name,age);pany=company;}}4.覆蓋父類的方法要求:

1.方法聲明形式一致(相同的方法名稱、參數(shù)列表、返回類型)2.方法權(quán)限不允許縮小

3.覆蓋的方法不允許拋出比父類方法更多的異常

在子類中可以根據(jù)需要對(duì)從父類中繼承來(lái)的方法進(jìn)行改造,把這個(gè)過(guò)程稱為覆蓋(也叫重寫)例:

classPerson{publicStringname;publicintage;

publicvoidgetInfo(){System.out.println(name);System.out.println(age);}}classStudentextendsPerson{Stringschool=newString();

publicvoidstudy(){ System.out.println("studding");}publicvoidgetInfo(){ super.getInfo();System.out.println(school);}

publicstaticvoidmain(String[]args)

{ Personp=newPerson();

="person";p.age=30;p.getInfo();

Students=newStudent();="student";s.age=16;s.school="清華大學(xué)";

s.getInfo();s.study();

}}

當(dāng)重載方法時(shí),在一個(gè)類中用相同的名字創(chuàng)建多個(gè)方法(每個(gè)方法的參數(shù)表不同);

當(dāng)覆蓋一個(gè)方法時(shí),在一個(gè)類中創(chuàng)建的方法與超類中方法的名字和參數(shù)表相同。

重載(overloading)與覆蓋(overriding)的差異:5.final關(guān)鍵字(1)Java中聲明類、屬性、方法時(shí),可使用關(guān)鍵字final來(lái)修飾。(2)final標(biāo)記的類不能被繼承。(3)final標(biāo)記的方法不能被子類重寫。(4)final標(biāo)記的變量即為常量,只能賦值一次。finalintX=3;X=4;//出錯(cuò)final標(biāo)記的成員變量必須在聲明的同時(shí)或在該類的構(gòu)造方法中顯式賦值,然后才能使用。classTest{finalintX=3;}或classTest{finalintX;Test(){X=3;}}(5)方法中定義的內(nèi)置類只能訪問(wèn)該方法內(nèi)的final類型的局部變量,用final定義的局部變量,相當(dāng)于是一個(gè)常量,它的生命周期超出方法的運(yùn)行周期。將一個(gè)形參定義成final也可以,這就限定了我們方法中修改形式參數(shù)的值。(6)java中的String類為final類,不能被繼承。它對(duì)編譯器和解釋器的正常運(yùn)行有很重要的作用,不能輕易改變。final類的特性保證了String類型的唯一性。

publicfinalclassStringextendsObject注意:

final標(biāo)記的變量(成員變量和局部變量)即成為常量,只能賦值一次,但這個(gè)常量只能在這個(gè)類的內(nèi)部使用,不能在類的外部使用。當(dāng)我們用publicstaticfinal共同標(biāo)記常量時(shí),這個(gè)常量就成了全局常量。而且這樣定義的常量只能在定義時(shí)賦值,即使在構(gòu)造方法里也不能對(duì)其賦值。在java中定義常量,總是用publicstaticfinal組合方式進(jìn)行標(biāo)記。Java中的全局變量也放在一個(gè)類中定義。二.抽象類與接口Java中可以定義一些不含方法體的方法,它的方法體的實(shí)現(xiàn)交給該類的子類根據(jù)自己的實(shí)際情況去實(shí)現(xiàn),這樣的方法就是抽象方法,包含抽象方法的類就叫抽象類。一個(gè)抽象類可以有多個(gè)抽象方法。抽象方法必須用abstract修飾符來(lái)定義,任何帶有抽象方法的類都必須聲明為抽象類1.抽象類(1)抽象類的定義規(guī)則:抽象類與抽象方法都必須用abstract關(guān)鍵字來(lái)修飾;抽象類不能被實(shí)例化,也就是不能用new去參生對(duì)象;抽象方法只需聲明,而不需實(shí)現(xiàn);含有抽象方法的類必須被聲明為抽象類,抽象類的子類必須覆蓋所有的抽象方法后才能被實(shí)例化,否則這個(gè)類還是個(gè)抽象類。(2)抽象方法的書寫格式

abstract返回類型抽象方法名(參數(shù)列表);(3)抽象類與抽象方法的例子

abstractclassA{abstractintadd(intx,inty);}注意:含有抽象方法的類肯定是抽象類,抽象類中某方法不一定是抽象的2.接口(1)接口:如果一個(gè)抽象類中的所有方法都是抽象的就可以將這個(gè)類用另外一種方式來(lái)定義,接口是抽象方法和常量的集合。是一種特殊的抽象類。提供復(fù)雜的軟件對(duì)象內(nèi)部與外界的交互。定義不相關(guān)類的共同行為,而不需考慮這些類之間的層次關(guān)系可以指明多個(gè)類需要實(shí)現(xiàn)的方法可以了解對(duì)象的編程界面,而不需了解對(duì)象所對(duì)應(yīng)的類(揭示一個(gè)編程界面,而不揭示類體)通過(guò)一個(gè)接口列表實(shí)現(xiàn)多重繼承(多重繼承的偽裝)(2)接口定義interface接口名[extends接口列表]{

接口體;}

聲明時(shí),public公有接口

extends類:只有一個(gè)父類

“isa”關(guān)系接口:可有多個(gè)父接口接口體:常量值,在接口中定義的常量可以被實(shí)現(xiàn)它的多個(gè)類共享,它默認(rèn)是用publicstaticfinal標(biāo)識(shí)的。

3.實(shí)現(xiàn)接口class類名implements接口列表{

類體;(可以使用接口中定義的常量,必須實(shí)現(xiàn)接口中定義的所有方法)}classFIFOQueueimplementsCollection{voidadd(Objectobj){…};voiddelete(Objectobj){…};voidfind(Objectobj){…};intcurrentCount(){…};}4.接口類型接口可以作為引用類型來(lái)使用,任何實(shí)現(xiàn)該接口的類的實(shí)例都可以存儲(chǔ)在該接口類型的變量中,通過(guò)這些變量可以訪問(wèn)類中所實(shí)現(xiàn)的接口中的方法,java運(yùn)行時(shí)系統(tǒng)會(huì)動(dòng)態(tài)的確定該使用哪個(gè)類中的方法.classTest_interface{publicstaticvoidmain(Stringargs[]){Collectionc1=newFIFOQueue();Collectionc2=newStack();c1.add(obj);c2.add(obj);}}publicinterfaceRunner{intID=1;voidrun();}interfaceAnimalextendsRunner{ voidbreathe();}abstractclassLandAnimalimplementsAnimal{publicvoidbreathe(){System.out.println("LandAnimalisbreathing");}}classFishimplementsAnimal{publicvoidrun(){ System.out.println("fishisswimming");}publicvoidbreathe(){ System.out.println("fishisbubbling");}}publicclassTestFish{publicstaticvoidmain(Stringargs[]){ Fishf=newFish(); intj=0; //j=f.ID;//一般不用對(duì)象來(lái)訪問(wèn) j=Runner.ID;System.out.println("j="+j);}}運(yùn)行結(jié)果:三.對(duì)象的多態(tài)性1.對(duì)象類型的轉(zhuǎn)換

(1)子類轉(zhuǎn)換為父類子類能自動(dòng)轉(zhuǎn)換為父類類型注:1)引用可以點(diǎn)取父類中的成員(編譯 時(shí)指向父類成員,運(yùn)行時(shí)動(dòng)態(tài)綁定 到子類中的成員)

2)不可以點(diǎn)取子類擴(kuò)充的成員(2)父類轉(zhuǎn)換為子類父類轉(zhuǎn)換為子類不會(huì)自動(dòng)進(jìn)行,必須強(qiáng)制轉(zhuǎn)換。classA{ publicvoidfunc1() { System.out.println("Afunc1iscalling"); } publicvoidfunc2() { func1(); }}例:classBextendsA{ publicvoidfunc1() { System.out.println("Bfunc1iscalling"); }publicvoidfunc3(){ System.out.println("Bfunc3iscalling"); }}classC{ publicstaticvoidmain(String[]args) { Bb=newB(); Aa=b; callA(a); callA(newB()); } publicstaticvoidcallA(Aa) { a.func1(); a.func2(); }}運(yùn)行結(jié)果:我們把callA方法作如下修改:publicstaticvoidcallA(Aa){ Bb=(B)a; b.func1(); b.func2(); b.func3();}運(yùn)行結(jié)果:classA{intaa=10;voidcallme(){System.out.println("InsideA’scallme()methoda="+aa);}}classBextendsA{Stringaa="China";voidcallme(){System.out.println("InsideB’scallme()methodaa="+aa);}}publicclassC{publicstaticvoidmain(Stringargs[]){/*父類對(duì)象創(chuàng)建時(shí)引用了子類的構(gòu)造方法,創(chuàng)建的實(shí)際上是子類的對(duì)象。*/Aa=newB();/*這一行運(yùn)行時(shí),顯示的是子類的callme()結(jié)果*/a.callme();System.out.println("aa="+a.aa);

System.out.println("aa="+((B)a).aa);} }上例說(shuō)明:

a為A類型的變量,用new建立A類型的子類B的一個(gè)實(shí)例,并將其引用存儲(chǔ)到a中。編譯時(shí)a.callme()指向父類A的成員方法,而運(yùn)行時(shí),則動(dòng)態(tài)綁定到子類B中的成員方法。故程序?qū)⒄{(diào)用B的callme()方法。運(yùn)行的多態(tài)性,體現(xiàn)了面向?qū)ο蟪绦蛟O(shè)計(jì)的代碼復(fù)用。運(yùn)行結(jié)果:InsideB’scallme()methodaa=Chinaaa=10aa=China總結(jié)

原則上,所引用的對(duì)象實(shí)例,必須含有欲轉(zhuǎn)換的類類型的實(shí)例,也就是說(shuō),所引用的對(duì)象實(shí)例的類類型,必須是欲轉(zhuǎn)換成的類、或它的子孫類。(3)instanceof操作符

可以用判斷是否一個(gè)類實(shí)現(xiàn)了某個(gè)接口,也可以用它來(lái)判斷一個(gè)實(shí)例對(duì)象是否屬于一個(gè)類。其語(yǔ)法格式為:對(duì)象instanceof類(或接口)

返回類型是布爾型:true或falsepublicstaticvoidCallA(Aa){if(ainstanceofB){Bb=newB();b.func1();b.func2();b.func3();}}2.Object類Java中有一個(gè)比較特殊的類-Object類,它就是所有類的父類。如果一個(gè)類沒(méi)有使用extends關(guān)鍵字明確標(biāo)識(shí)繼承另外一個(gè)類,那么這個(gè)類就默認(rèn)繼承Object類,因此,Object類是所有類的最高層類。

publicclassPerson{...}

等價(jià)于:

publicclassPersonextendsObject{...}Object類中有一個(gè)equals方法,用于比較兩個(gè)對(duì)象是否相等,默認(rèn)返回值是false。由于類的繼承性,可以在任何類中使用equals方法,但返回值總是false,比較結(jié)果就不一定正確了,所以,自定義類中必須覆equals方法。classStudent{ Stringname;intage;publicbooleanequals(Objectobj){ Studentst=null; if(objinstanceofStudent) st=(Student)obj; else returnfalse;if(==&&st.age==this.age) returntrue; elsereturnfalse;}st.CompareTo(this)publicstaticvoidmain(String[]args) { Studentp=newStudent(); Studentq=newStudent(); ="xyz"; p.age=13; ="xyz"; q.age=13; if(p.equals(q)) System.out.println("p與q相等"); else System.out.println("p與q不等"); }}運(yùn)行結(jié)果:3.面向?qū)ο蟮亩鄳B(tài)性特點(diǎn):

(1)應(yīng)用程序不必為每一個(gè)派生類(子類)編寫功能調(diào)用,只需對(duì)抽象基類進(jìn)行處理即可。這叫“以不變應(yīng)萬(wàn)變”,可大大提高程序的可復(fù)用性。

(2)派生類的功能可被基類的方法或引用變量調(diào)用,這叫向后兼容可以提高程序的可擴(kuò)充性和可維護(hù)性。以前寫的程序可被后來(lái)的程序調(diào)用不足為奇,現(xiàn)在寫的程序可調(diào)用以后寫的程序就很了不起了。4.匿名類匿名類(anonymouseclass)—內(nèi)部類的一種特殊形式.本地類和匿名類最主要的區(qū)別是匿名類沒(méi)有自己的名字.abstractclassA{abstractpublicvoidfun1();}publicclassOuter{publicstaticvoidmain(String[]args){

classInnerextendsA{publicvoidfun1(){System.out.println("implementforfun1");}}newOuter().callInner(newInner());}publicvoidcallInner(Aa){a.fun1();}}

運(yùn)行結(jié)果:對(duì)于上面程序,可以簡(jiǎn)寫publicclassOuter{publicstaticvoidmain(String[]args){newOuter().callInner(newInner(){ publicvoidfun1(){System.out.println("implementforfun1");}});}publicvoidcallInner(Aa){a.fun1();}}四.異常

異常就是在程序的運(yùn)行過(guò)程中所發(fā)生的異常事件,它中斷指令的正常執(zhí)行。Java中提供了一種獨(dú)特的處理異常的機(jī)制,通過(guò)異常來(lái)處理程序設(shè)計(jì)中出現(xiàn)的錯(cuò)誤例:classExceptionDemo2{publicstaticvoidmain(Stringargs[]){ inta=0;System.out.println(5/a);}}運(yùn)行結(jié)果:

因?yàn)槌龜?shù)不能為0,所以在程序運(yùn)行的時(shí)候出現(xiàn)了除0溢出的異常事件。為什么有的異常在編譯時(shí)出現(xiàn),而有的異常是在運(yùn)行時(shí)出現(xiàn)的?讓我們繼續(xù)學(xué)習(xí)java的異常處理機(jī)制。1.概述

(1)異常事件:中斷程序正常執(zhí)行流程的事件。

java中的異常事件:

錯(cuò)誤Error(可處理的錯(cuò)誤)

異常Exception(可以處理,編寫代碼,

不影響程序的繼續(xù)執(zhí)行)(2)異常類

1)ArithmeticException

例:inti=12/0;2)NullPointerException

例:Dated=null; System.out.println(d.toString());3)NegativeArraySizeException:數(shù)組大小為負(fù)數(shù)異常4)ArrayIndexOutOfBoundsException:數(shù)組越界異常5)SecurityException:安全異常,特指applet。

2.異常機(jī)制

Java具有的一般目的的錯(cuò)誤處理系統(tǒng)稱為異常機(jī)制(Exceptionmechanism)的特性。異常機(jī)制由兩部分組成:拋出異常和捕獲它們。拋出一個(gè)異常意味著發(fā)出一個(gè)錯(cuò)誤信號(hào),捕獲它意味著捕獲和處理已經(jīng)拋出的錯(cuò)誤。異常的傳遞規(guī)則:異常向下通過(guò)調(diào)用堆棧直到它被一個(gè)方法處理。3.異常處理

java執(zhí)行過(guò)程中,出現(xiàn)了異常,會(huì)生成異常對(duì)象,其中包含信息有異常事件類型以及異常發(fā)生時(shí)程序的運(yùn)行狀態(tài),異常對(duì)象將傳遞給java運(yùn)行時(shí)系統(tǒng),這一過(guò)程(產(chǎn)生和提交)叫拋出異常.異常處理就是程序中編寫代碼捕獲異常,處理它們,使程序繼續(xù)執(zhí)行。

a.結(jié)構(gòu):

try{

......

}catch(ExceptionName1e){

......

}catch(ExceptionName2e){

......

}

......

}finally{

......

}

try捕獲異常的第一步是用try{…}選定捕獲異常的范圍,由try所限定的代碼塊中的語(yǔ)句在執(zhí)行過(guò)程中可能會(huì)生成異常對(duì)象并拋棄。catch每個(gè)try代碼塊可以伴隨一個(gè)或多個(gè)catch語(yǔ)句,用于處理try代碼塊中所生成的異常事件。catch語(yǔ)句只需要一個(gè)形式參數(shù)指明它所能夠捕獲的異常類型,這個(gè)類必須是Throwable的子類,運(yùn)行時(shí)系統(tǒng)通過(guò)參數(shù)值把被拋棄的異常對(duì)象傳遞給catch塊。

在catch塊中是對(duì)異常對(duì)象進(jìn)行處理的代碼,與訪問(wèn)其它對(duì)象一樣,可以訪問(wèn)一個(gè)異常對(duì)象的變量或調(diào)用它的方法。

getMessage()是類Throwable所提供的方法,用來(lái)得到有關(guān)異常事件的信息,類Throwable還提供了方法printStackTrace()用來(lái)跟蹤異常事件發(fā)生時(shí)執(zhí)行堆棧的內(nèi)容。

try{

......}catch(FileNotFoundExceptione){

System.out.println(e);

System.out.println("message:"+e.getMessage());

e.printStackTrace(System.out);}catch(IOExceptione){

System.out.println(e);}例如:catch語(yǔ)句的順序:捕獲異常的順序和catch語(yǔ)句的順序有關(guān),當(dāng)捕獲到一個(gè)異常時(shí),剩下的catch語(yǔ)句就不再進(jìn)行匹配。因此,在安排catch語(yǔ)句的順序時(shí),首先應(yīng)該捕獲最特殊的異常,然后再逐漸一般化。也就是一般先安排子類,再安排父類。finally:捕獲異常的最后一步是通過(guò)finally語(yǔ)句為異常處理提供一個(gè)統(tǒng)一的出口,使得在控制流轉(zhuǎn)到程序的其它部分以前,能夠?qū)Τ绦虻臓顟B(tài)作統(tǒng)一的管理。不論在try代碼塊中是否發(fā)生了異常事件,finally塊中的語(yǔ)句都會(huì)被執(zhí)行。finally代碼塊唯一不能被執(zhí)行的情況是:在被保護(hù)的代碼塊中執(zhí)行了System.exit(0).b.throws關(guān)鍵字

如果在一個(gè)方法中生成了一個(gè)異常,但是這一方法并不確切地知道該如何對(duì)這一異常事件進(jìn)行處理,這時(shí),一個(gè)方法就應(yīng)該聲明拋出異常,使得異常對(duì)象可以從調(diào)用棧向后傳遞,直到有合適的方法捕獲它為止。例:classTest{publicintdevide(intx,inty)throws DevidedByMinusException,ArithmeticException { intresult=x/y; returnx/y; }}classDevidedByMinusExceptionextendsException{intdevisor;public

DevidedByMinusException(String

msg,int

devisor){super(msg);this.devisor=devisor;}publicintgetDevisor(){returndevisor;}}publicclassTestException{publicstaticvoidmain(String[]args){try{ //intresult=newTest().devide(3,0); intresult=newTest().devide(3,-1); //intresult=newTest().devide(3,1); System.out.println("theresultis"+result);}catch(DevidedByMinusExceptione){System.out.println("programisrunninginto"+ "DevideByMinusException"); System.out.println(e.getMessage());System.out.println("thedevisoris"+e.getDevisor());}

catch(Exceptione){System.out.println("programisrunninginto"+ "otherunknownedException");System.out.println(e.getMessage());}System.out.println("programisrunninghere,that+isnormal!");}}運(yùn)行結(jié)果:c.throw關(guān)鍵字Java是通過(guò)throw關(guān)鍵字拋出異常對(duì)象的,其語(yǔ)法格式如下:

throw異常對(duì)象在一個(gè)方法內(nèi)部使用throw關(guān)鍵字拋出異常對(duì)象,如果該方法內(nèi)部沒(méi)有用try…catch對(duì)這個(gè)拋出的異常進(jìn)行處理,則此方法應(yīng)聲明拋出異常,由該方法的調(diào)用者進(jìn)行處理。classTest{

publicintdevide(intx,inty)throws

DevidedByMinusException,ArithmeticException

{

if(y<0)

thrownewDevidedByMinusException("除數(shù)為負(fù)",y);

intresult=x/y;

returnx/y;

}}

如果要在devide函數(shù)接收到的第二個(gè)參數(shù)為負(fù)數(shù)時(shí),向該方法的調(diào)用者拋出用戶自定義的DevidedByMinusException異常對(duì)象。則應(yīng)對(duì)該方法作如下修改:運(yùn)行結(jié)果:五.包SUN公司的JDK,系統(tǒng)軟件開發(fā)商,開發(fā)工具商都會(huì)提供各種用途的類,如對(duì)這些類進(jìn)行分門別類的使用和存放,則使用時(shí)將極度困難和不便,同時(shí),也極易出現(xiàn)類的命名沖突。Java引入包(package)機(jī)制,提供類的多層類命名空間。看看下面的例子1.Package語(yǔ)句及應(yīng)用packageorg.it315;publicclassTestPackage{publicstaticvoidmain(String[]args){ newTest().print();}}classTest{publicvoidprint(){System.out.println("theprogramis+ demostratinghowtousingpackage!");}}編譯、運(yùn)行結(jié)果為:

classpath設(shè)置一定是指向頂層包名所對(duì)應(yīng)的對(duì)應(yīng)的目錄的父目錄(如:d:\myjava),而不是指向.class文件所在的目錄(d:\myjava\org\it315)。即使文件名都是TestPackage.class,但其包含的類的完整路徑不一定相同,如:org.it315.TestPackage.class類與com.SUN.TestPackage.class類的文件名都是TestPackage.class,但卻是兩個(gè)完全不同的類。同一包中的類不必位于同樣的目錄,如org.it315.class1與org.it315.class2,完全可以一個(gè)位于c盤的某個(gè)位置,另一個(gè)位于d盤的一個(gè)位置,只要classpath分別指向這兩個(gè)位置就可以了。有了包的概念,我們就可以理解java實(shí)際上是通過(guò)classpath去尋找頂層包名的原理了。在當(dāng)前目錄下,創(chuàng)建org\it315,將TestPackage.class與Test.class文件移動(dòng)到org\it315目錄中,執(zhí)行命令:

d:\myjava\javaorg.it315.TestPackage

我們?cè)诰幾g時(shí),讓javac.exe來(lái)生成與包名層次相對(duì)應(yīng)的目錄結(jié)構(gòu),而不必像上面那樣手動(dòng)去創(chuàng)建,運(yùn)行javac命令,它有一個(gè)選項(xiàng)–d,用于指定編譯生成的.class文件存放的位置。點(diǎn)(.)代表當(dāng)前目錄。提示:類的名稱是org.it315.TestPackage,而不是 TestPackage,即使找到TestPackage.class 文件,也不可能正常運(yùn)行。課堂練習(xí)1.在命令行中進(jìn)入org\it315目錄中,運(yùn)行javaTestPackage,結(jié)果會(huì)怎么樣?2.還是在org\it315目錄中,運(yùn)行javaorg.it315.TestPackage,

結(jié)果又會(huì)怎么樣?提示:假設(shè)classpath中只包含當(dāng)前目錄(不考慮其 它目錄)的情況下,要運(yùn)行完整名稱為: org.it315.TestPackage的類,JVM會(huì)在當(dāng)前目錄 中查找子目錄org\it315中的TestPackage文 件,當(dāng)然找不到了。3.將TestPackage.java源文件中的packageorg.it315;語(yǔ)句注釋掉,重新編譯,將生成的.class文件放在d:\javawork\org\it315目錄下,設(shè)置classpath環(huán)境變量包含d:\javawork目錄,運(yùn)行

javaorg.it315.TestPackage

結(jié)果又會(huì)怎么樣?提示:不要認(rèn)為把一個(gè)類放在某個(gè)目錄下,這個(gè)目錄就是該類的包名,不是有了目錄結(jié)構(gòu)就有了包名,包名必須在程序中通過(guò)package語(yǔ)句指定,而不是靠目錄結(jié)構(gòu)指定,是先要有包名后,才需要相應(yīng)的目錄結(jié)構(gòu)。雖然d:\javawork目錄中也包含org\it315子目錄,但生成的文件中并不包含完整名為:org.it315.TestPackage的類。

有了包的概念,下來(lái)我們看不同包中的類是如何調(diào)用的。將剛才的TestPackage.java中的兩個(gè)類放在不同的包中,用兩個(gè)單獨(dú)的.java源文件容納這兩個(gè)類,程序如下:程序一(源文件名為:TestPackage.java):

packageorg.it315;publicclassTestPackage{ publicstaticvoidmain(String[]args) { neworg.it315.example.Test().print(); }}2.import語(yǔ)句及應(yīng)用程序二(源文件名為:Test.java):packageorg.it315.example;publicclassTest{publicvoidprint(){System.out.println("Programis"+

"

demostratinghowtousepackage!");}}編譯、運(yùn)行結(jié)果為:

每次用到類名是都要加前綴,如:

neworg.it315.example.Test()

顯然有點(diǎn)繁瑣。在java中使用import來(lái)簡(jiǎn)化這個(gè)問(wèn)題。我們修改TestPackage.java源文件的代碼如下所示,重新編譯、運(yùn)行,一切順利。packageorg.it315;importorg.it315.example.*;publicclassTestPackage{publicstaticvoidmain(String[]args){ newTest().print();}}六.?dāng)?shù)組(一).一維數(shù)組1.聲明數(shù)組數(shù)組是最簡(jiǎn)單的一種復(fù)合數(shù)據(jù)類型,其中每個(gè)元素具有相同的數(shù)據(jù)類型,包括復(fù)合數(shù)據(jù)類型和基本數(shù)據(jù)類型。

Pointp[];charc[];

inta[];=int[]a;

int[]a,b;≠inta[],b;

2.創(chuàng)建數(shù)組

用關(guān)鍵字new來(lái)創(chuàng)建:c=newchar[5];

(字符數(shù)組,5個(gè)字符型數(shù)據(jù))c

0x1234

0000

0000

0000

0000

0000

5int[]x=newint[100];p=newPoint[3];

(Point類型數(shù)組,3個(gè)變量元素)

0x1245p[0]p[1]p[2]nullnull3nullp0,0nullnullp[2]=newPoint();0,0

對(duì)于類類型,每個(gè)元素并沒(méi)有指向一個(gè)

具體的Point對(duì)象,還必須分別創(chuàng)建:0,00x1245p[0]p[1]p[2]3

pp[0]=newPoint();p[1]=newPoint();null0x2464

nullnull0x24660x2468聲明、創(chuàng)建一步完成:

inta[]=newint[3];

a0x45670003a[0]a[1]a[2]length聲明、創(chuàng)建一步完成:

inta[]=newint[3];

a0x45670003a[0]a[1]a[2]length3.初始化數(shù)組

當(dāng)創(chuàng)建一個(gè)數(shù)組時(shí),每個(gè)元素都已自動(dòng)初始化.

手工初始化的方法是:inta[]={1,2,3,4,5};或:

inta[]=newint[]{

溫馨提示

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