JAVA2實(shí)用教程第4講_第1頁
JAVA2實(shí)用教程第4講_第2頁
JAVA2實(shí)用教程第4講_第3頁
JAVA2實(shí)用教程第4講_第4頁
JAVA2實(shí)用教程第4講_第5頁
已閱讀5頁,還剩78頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

第四講:Java面向?qū)ο蟮木幊?續(xù))本講主要內(nèi)容類的繼承對象類型的轉(zhuǎn)換運(yùn)行中的多態(tài)性抽象類和抽象方法super關(guān)鍵字Java接口類的進(jìn)一步討論1回顧面向?qū)ο蟮木幊虒ο?實(shí)體/實(shí)例):

具有:狀態(tài),行為對象間的聯(lián)系:通過發(fā)送消息類與對象的關(guān)系:描述與實(shí)體三大特性:封裝性、繼承性、多態(tài)性類與對象類(對象原型):對象封裝了變量(屬性)和方法(操作)變量:成員變量(實(shí)例變量和類變量)、局部變量方法:成員方法(實(shí)例方法和類方法)、方法重載構(gòu)造方法:特殊方法,創(chuàng)建實(shí)例用對象的生命期:新建、使用和消除this關(guān)鍵字成員和類的安全訪問權(quán)限2類的UML表示一個類的UML圖表示3publicclassBox{intlong,width,height;voidsetLong(intlongValue){long=longValue;}voidsetWidth(intwidthValue){width=widthValue;}voidsetHeight(intheightValue){height=heightValue;}voidsetBox(intlongValue,intwidthValue,intheightValue){long=longValue;width=widthValue;height=heightValue;}intgetLong(){returnlong;}intgetWidth(){returnwidth;}intgetHeight(){returnheight;}}

一個Box類的UML表示4定義一個帶訪問限定的類(UML例示)classPoint{privateintx,y;publicvoidsetPoint(){…}publicintgetX(){…}publicintgetY(){…}publicStringtoString(){…}}5類的繼承繼承是指一個類的定義可以基于另外一個已經(jīng)存在的類(即子類基于父類),從而實(shí)現(xiàn)父類代碼的重用。兩個類之間的這種繼承關(guān)系可以用UML圖形符號表示:6類的繼承(續(xù))繼承可以先建一個共有屬性的一般類,再根據(jù)一般類建有特殊屬性的新類新類繼承一般類的狀態(tài)和行為,并可以增加自己新狀態(tài)和行為。由繼承得到的新類稱為子類,被繼承的已有類稱為父類(超類)Java不支持多重繼承(子類只能有一個父類)注意:Java不支持多重繼承!!7繼承的作用可重用已有代碼(繼承性)可更改部分原有功能隱藏父類中的部分成員變量重寫父類中的部分成員方法(覆蓋)可增加新屬性和功能增加自己的成員變量和成員方法優(yōu)點(diǎn):可避免類共性的重復(fù)說明,提高軟件的重用性、可用性和界面的一致性。節(jié)省開發(fā)時間。8多層次繼承9創(chuàng)建子類在類聲明中加入extends子句格式:

class子類名

extends超類名

{

類體 }

例如:classStudentsextendsPeople{...}

注意:Java中一個類只準(zhǔn)有一個直接超類(單繼承)如果沒有extends說明,則超類是java.lang.Object10子類舉例(同包中的繼承)例子15importjava.applet.*;importjava.awt.*;classFather{privateintmoney;floatweight,height;Stringhead;Stringspeak(Strings) {returns; }}classSonextendsFather{Stringhand,foot;}classFather{privateintmoney;floatweight,height;Stringhead;Stringspeak(Strings){returns;}}classSonextendsFather{Stringhand,foot;}父類變量:money、weight、height、head子類可用變量:weight、height、headhand,foot11子類舉例(同包中的繼承)(續(xù))publicclassExample4_17extendsApplet{Sonboy;publicvoidinit() {boy=newSon();boy.weight=1.80f;boy.height=120f;boy.head="一只頭";boy.hand="兩只手";boy.foot="兩只腳"; }

publicvoidpaint(Graphicsg) {g.drawString(boy.speak("我是兒子"),5,20);

g.drawString(boy.hand+boy.foot+boy.head+boy.weight+boy.height,5,40);

}}//運(yùn)行結(jié)果:我是兒子兩只手兩只腳一只頭1.8120.0publicclassExample4_15{publicstaticvoidmain(Stringargs[]){Sonboy;boy=newSon();boy.weight=1.80f;boy.height=120f;boy.head="一個頭";

boy.hand="兩只手";

boy.foot="兩只腳";

boy.speak("我是兒子");System.out.println(boy.hand+boy.foot+boy.head+boy.weight+boy.height);}}//運(yùn)行結(jié)果:

我是兒子兩只手兩只腳一只頭1.8120.012子類和父類(非同包中的繼承性)如果子類和父類不在同一包中只繼承public或protected修飾的成員不能繼承友好成員packagetom.jiafei;publicclassFather{intheight;

protectedintmoney;

publicintweight;

protectedintgetMoney(){returnmoney;}……}package;importtom.jiafei.*;classJerryextendsFather

{publicstaticvoidmain(String[]args){Jerryj=newJerry();

j.height=12;

//非法j.weight=200;j.money=200;intm=j.getMoney();…….}例子4.15b13變量隱藏與方法重寫(覆蓋)隱藏當(dāng)子類中定義的成員變量和父類中的成員變量同名時,則父類中的成員變量被隱藏。當(dāng)子類中定義的一個方法,并且這個方法的名字、返回類型、及參數(shù)個數(shù)和類型跟父類的某個方法完全相同時,則父類的這個方法將被覆蓋,也稱子類重寫父類的方法。***子類通過對成員變量的隱藏和對方法的重寫可以把父類的狀態(tài)和行為改變?yōu)樽陨淼臓顟B(tài)和行為。

14子類舉例二例子16importjava.applet.*;importjava.awt.*;classChengji{ floatf(floatx,floaty) {returnx*y; }}classXiangjiaextendsChengji{floatf(floatx,floaty) {returnx+y; }}classChengji{floatf(floatx,floaty){returnx*y;}}classXiangjiaextendsChengji

{floatf(floatx,floaty){returnx+y;}}子類覆蓋父類的f方法將乘運(yùn)算改為加運(yùn)算publicclassExample4_16{publicstaticvoidmain(Stringargs[]){Xiangjiasum;sum=newXiangjia();floatc=sum.f(4,6);System.out.println(c);}}運(yùn)行結(jié)果:sum=10.0例子4.1615子類舉例例子4.17importjava.applet.*;importjava.awt.*;classArea{ floatf(floatr) {return3.14159f*r*r;} floatg(floatx,floaty) {returnx+y;}}classCircleextendsArea{floatf(floatr) {return3.14159f*2.0f*r;}}classArea{protectedfloatf(floatr){return3.14159f*r*r;}floatg(floatx,floaty){returnx+y;}}classCircleextendsArea{public

floatf(floatr)

{return3.14159f*2.0f*r;}}注意:

子類重寫父類方法時,不可以降低方法的訪問權(quán)限public>protected>友好>private16子類舉例(續(xù))publicclassExample4_8extendsApplet{Circleyuan;publicvoidinit() {yuan=newCircle(); }publicvoidpaint(Graphicsg) {g.drawString("yuan="+yuan.f(5.0f),5,20); g.drawString(""+yuan.g(2.0f,8.0f),5,40); }}//運(yùn)行結(jié)果:yuan=31.41590110.0publicclassExample4_17{publicstaticvoidmain(Stringargs[]){Circleyuan;yuan=newCircle();floatlength=yuan.f(5.0f);floatsum=yuan.g(232.645f,418.567f);System.out.println(length);System.out.println(sum);}}//運(yùn)行結(jié)果:31.415901651.212調(diào)用父類的方法g調(diào)用子類的方法f17多層次繼承舉例類層次結(jié)構(gòu)

VehicleCarAircraftWhirlybirdJet

Vehicle

Car

Aircraft

Whirlybird

JetUML表示18多層次繼承舉例(續(xù))創(chuàng)建一個交通工具的類(Vehicle)和一個小汽車的子類(Car)classVehicle{publicvoidstart() {System.out.println("Starting..."); }}classCarextendsVehicle{publicvoiddrive() {System.out.println("Driving..."); }}classVehicle//創(chuàng)建一個交通工具的類{publicvoidstart() {System.out.println("Starting..."); }}classCarextendsVehicle//一個小汽車的子類{publicvoiddrive() {System.out.println("Driving..."); }}classAircraftextendsVehicle//一個飛行器的子類{publicvoidfly() {System.out.println("Flying..."); }}19多層繼承舉例(續(xù))從飛行器(Aircraft)中再派生兩個子類,螺旋直升機(jī)(Whirlybird)和噴氣機(jī)(Jet)

classWhirlybirdextendsAircraft{publicvoidwhirl() {System.out.println("Whirling..."); }}classJetextendsAircraft{publicvoidzoom() {System.out.println("Zooming..."); }}classWhirlybirdextendsAircraft{publicvoidwhirl() {System.out.println("Whirling..."); }}classJetextendsAircraft{publicvoidzoom() {System.out.println("Zooming..."); }}20多層繼承舉例(續(xù)2)實(shí)例化這些類classApp{ publicstaticvoidmain(String[]args) { System.out.println("Creatingacar..."); Carc=newCar(); c.start();c.drive(); System.out.println(); System.out.println("Creatingajet..."); Jetj=newJet(); j.start(); j.fly(); j.zoom(); }}運(yùn)行結(jié)果

Creatingacar...Starting...Driving...Creatingajet...Starting...Flying...Zooming...21子類對象的初始化順序classA{A() {System.out.println("ConstructingA"); }}classBextendsA{B() {System.out.println("ConstructingB"); }}classCextendsB{C() {System.out.println("ConstructingC"); }}classDextendsC{D() {System.out.println("ConstructingD"); }}22子類對象的初始化順序(續(xù))classTestapp{ publicstaticvoidmain(String[]args) { Dobj=newD(); System.out.println("MainProgram!"); }}運(yùn)行結(jié)果

ConstructingAConstructingBConstructingCConstructingDMainProgram!注意:構(gòu)造方法的調(diào)用順序:23final關(guān)鍵字final類:不能被繼承的類(即不能有子類)格式:

finalclass最終類名{ ... }final方法:不能被覆蓋的方法(不可改變的方法)格式:

final返回類型

最終方法名([參數(shù)表]) { ... }

24final舉例classA{finaldoublePI=3.1415926;}classDemo{publicstaticvoidmain(StringStr[]){Aa=newA();a.PI=2.718;//錯誤:不能更改final變量}}25final舉例-2classAbc{finalvoidmethod(){…//原有的程序代碼}classXyzextendAbc{voidmethod(){//錯誤:不能覆蓋final方法…//新的程序代碼}}26classA{final

doublePI=3.1415926;publicdoublegetArea(finaldoubler){r=89;returnPI*r*r;}}publicclassExample4_18{publicstaticvoidmain(Stringargs[]){Aa=newA();System.out.println("面積:"+a.getArea(100));}}例子4.18非法27對象的類型轉(zhuǎn)換指對象引用時的(類)類型轉(zhuǎn)換上轉(zhuǎn)型對象(指子類對象賦給超類對象變量)下轉(zhuǎn)型對象(指超類對象賦給子類對象變量)上轉(zhuǎn)型舉例(假設(shè):A類是B類的父類)

Aaa=newB();或Aa;Bb=newB();

a=b;注意:對象的類型轉(zhuǎn)換并非對對象的實(shí)體進(jìn)行轉(zhuǎn)化。實(shí)體沒有變。28對象類型轉(zhuǎn)換規(guī)則上轉(zhuǎn)型對象不能操作子類新增的成員(變量/方法)上轉(zhuǎn)型對象可以操作子類繼承或重寫的成員如果子類重寫了父類的方法,則上轉(zhuǎn)型對象調(diào)用的是子類重寫后的方法注意:上轉(zhuǎn)型對象的實(shí)體是子類創(chuàng)建的對象的上轉(zhuǎn)型對象對象子類新增的成員變量子類新增的成員方法繼承的成員變量繼承或重寫的成員方法注意:上轉(zhuǎn)型對象的實(shí)體是子類創(chuàng)建的29//對象類型轉(zhuǎn)換例子4.19

class類人猿

{privateintn=100;

voidcrySpeak(Strings)

{System.out.println(s);}

}

classPeopleextends類人猿

{voidcomputer(inta,intb)

{intc=a*b;

System.out.println(c);}

voidcrySpeak(Strings)

{System.out.println("**"+s+"**");}

}

classExample4_19

{publicstaticvoidmain(Stringargs[])

{類人猿monkey=newPeople();

//monkey是People對象的上轉(zhuǎn)型對象

monkey.crySpeak("Ilovethisgame");

Peoplepeople=

(People)

monkey;

puter(10,10);

}

}注意:把上轉(zhuǎn)型對象強(qiáng)制轉(zhuǎn)化為子類的對象monkey.n=1000;可以嗎?30運(yùn)行時多態(tài)

運(yùn)行時多態(tài)指父類的某方法被子類重寫后,可以各自產(chǎn)生自己的功能行為對于子類創(chuàng)建的一個對象如果子類重寫了父類的方法,則運(yùn)行時系統(tǒng)調(diào)用子類的方法(稱為覆蓋)如果子類繼承了父類的方法(未重寫),則運(yùn)行時自然相當(dāng)于調(diào)用了父類的方法Java中也容許子類中對父類方法重載同名不同參數(shù)31class動物{voidcry(){}}class狗extends動物{voidcry(){System.out.println("汪汪…");}}class貓extends動物{voidcry(){System.out.println("喵喵…");}}classExample4_20{publicstaticvoidmain(Stringargs[]){動物dongwu;if(Math.random()>=0.5){dongwu=new狗();dongwu.cry();}else{dongwu=new貓();dongwu.cry();}}}多態(tài)性4.20

動物

貓32abstract類和abstract方法abstract類:必須被繼承(與final的作用相反)格式

abstractclass抽象類名

{ ... }abstract方法:必須被覆蓋格式

abstract返回類型

抽象方法名([參數(shù)表]);注意:此方法定義中沒有方法體33abstract舉例4.21abstractclassA{abstractintmin(intx,inty);intmax(intx,inty){returnx>y?x:y;}}classBextendsA{intmin(intx,inty){returnx<y?x:y;}}只關(guān)心功能,不關(guān)心行為實(shí)現(xiàn)。由子類實(shí)現(xiàn)具體功能。34abstract舉例4.21(續(xù))publicclassExample4_21{publicstaticvoidmain(Stringargs[]){Aa;Bb=newB();intmax=b.max(12,34);intmin=b.min(12,34);System.out.println("max="+max+"min="+min);a=b;max=a.max(12,34);System.out.println("max="+max);}}Aa=newA();可以嗎?35abstract舉例二abstractclass圖形{publicabstractdouble求面積();}class梯形extends圖形

{doublea,b,h;

梯形(doublea,doubleb,doubleh){this.a=a;this.b=b;this.h=h;}publicdouble求面積(){return((1/2.0)*(a+b)*h);}}36abstract舉例二(續(xù))class圓形extends圖形

{doubler;

圓形(doubler){his.r=r;}publicdouble求面積(){return(3.14*r*r);}}37abstract舉例二(續(xù)2)class堆{圖形底;

double高;堆(圖形底,double高){this.底=底;this.高=高;}

void換底(圖形底){this.底=底;}

publicdouble求體積(){return(底.求面積()*高)/3.0;}}38abstract舉例二(續(xù)3)publicclassExample4_22{publicstaticvoidmain(Stringargs[]){堆zui;

圖形

tuxing;tuxing=new梯形(2.0,7.0,10.7);

System.out.println("梯形的面積"+tuxing.求面積());

zui=new堆(tuxing,30);System.out.println("梯形底的堆的體積"+zui.求體積());

tuxing=new圓形(10);

System.out.println("半徑是10的圓的面積"+tuxing.求面積());

zui.換底(tuxing);System.out.println("圓形底的堆的體積"+zui.求體積());}}39Abstract使用要點(diǎn)

①abstract類不能直接用new進(jìn)行實(shí)例化②abstract方法,只有聲明部分,沒有方法體③如果一個類繼承abstract類,它必須實(shí)現(xiàn)超類的所有abstract方法④含有abstract方法的類必須是abstract類abstract類可以定義非abstract方法⑤

abstract方法不能用修飾詞private或者final注意:構(gòu)造方法和靜態(tài)方法也不能作為abstract方法。

40關(guān)鍵字superSuper當(dāng)前對象的超類引用,實(shí)現(xiàn)對超類成員的訪問。使用super的三種情況:

調(diào)用超類的構(gòu)造方法調(diào)用超類被覆蓋的方法訪問超類被隱藏的成員變量

41super的使用方法舉例一例子23classStudent{intnumber;Stringname;Student(intnumber,Stringname) {this.number=number;=name;System.out.println("Iam"+name+"mynumberis"+number); }}42super的使用方法舉例一(續(xù)一)classUniver_StudentextendsStudent{boolean婚否;

Univer_Student(intnumber,Stringname,booleanb){

super(number,name);

婚否=b; System.out.println("婚否="+婚否);}}43super的使用方法舉例一(續(xù)二)publicclassExample4_23{publicstaticvoidmain(Stringargs[]) {Univer_Studentzhang=newUniver_Student(9901,"和曉林",false); }}44super的使用方法舉例二classAverageextendsSum{intn;floatf() {floatc;super.n=n; c=super.f(); returnc/n; }floatg() {floatc;c=super.f(); returnc/2; }}例子24classSum{intn;floatf(){floatsum=0;

for(inti=1;i<=n;i++) sum=sum+i;returnsum;}}classAverageextendsSum{intn;floatf() {floatc;super.n=n; c=super.f(); returnc/n; }floatg() {floatc;c=super.f(); returnc/2; }}45super的使用方法舉例二(續(xù))publicclassExample4_24{publicstaticvoidmain(Stringargs[]) {Averageaver=newAverage(); aver.n=100; floatresult_1=aver.f(); floatresult_2=aver.g();System.out.println("result_1="+result_1);System.out.println("result_2="+result_2); }}46接口(interface)接口是一種特殊形式的抽象類,它主要用來組織公用的常量,并統(tǒng)一操作行為的格式,通常它被應(yīng)用在兩個主要方面:用接口包裝常量。可以將各式各樣的常量放在接口中,讓每個使用這些常量的類對象實(shí)現(xiàn)這個接口,從而達(dá)到共享這些常量的目的用接口實(shí)現(xiàn)多態(tài)性。將成員方法從類中分離出來組成一個接口,隨后由每個類實(shí)現(xiàn)這個接口47接口(續(xù))Java中還可利用接口,解決類的多重繼承問題接口作用統(tǒng)一操作名稱(實(shí)現(xiàn)不相關(guān)類的相同行為)規(guī)范界面(設(shè)計對象的公共交互性界面)只要了解對象的交互信息,無需了解對象所對應(yīng)的類。接口只是關(guān)心可有什么功能,不關(guān)心功能的具體實(shí)現(xiàn),具體功能實(shí)現(xiàn)由子類中定義48接口定義接口定義含兩部分:接口聲明和接口體

[public]interface

接口名[extends超接口表]{

接口體 }接口名通常以able或ible結(jié)尾通常接口是作為一個整體聲明的特殊方法接口體包含兩部分常量定義方法定義:只進(jìn)行方法的聲明,不提供方法的實(shí)現(xiàn)(沒有方法體),用分號“;”結(jié)尾。49接口定義的例子

interfacePrintable{finalintMAX=100;voidadd();floatsum(floatx,floaty);}注意:

接口中所有的變量都默認(rèn)為是finalstatic屬性接口中所有的方法都默認(rèn)為是abstract屬性50接口的使用

一個類通過使用關(guān)鍵字implements聲明自己使用一個或多個接口,接口名之間用逗號隔開classAimplementsPrintable,Addable{。。。}

classDogextendsAnimalimplementsEatable,Sleepable{。。。}51接口的使用舉例4.25interfaceComputable{intMAX=100;intf(intx);}classJapanimplementsComputable{intnumber;publicintf(intx){return44+x;}}52接口的使用舉例(續(xù)1)classChinaimplementsComputable{intnumber;publicintf(intx)//不要忘記public關(guān)鍵字{intsum=0;for(inti=1;i<=x;i++){sum=sum+i;}returnsum;}}53接口的使用舉例(續(xù)2)publicclassExample4_25{publicstaticvoidmain(Stringargs[]){Chinazhang;Japanhenlu;zhang=newChina();henlu=newJapan();zhang.number=991898+Computable.MAX;henlu.number=941448+Computable.MAX;System.out.println("number:"+zhang.number+"求和"+zhang.f(100));System.out.println("number:"+henlu.number+"求和"+henlu.f(100));}}54使用接口要點(diǎn)如果一個類使用了某個接口,那么這個類必須實(shí)現(xiàn)該接口的所有方法,即為這些方法提供方法體。在類中實(shí)現(xiàn)接口的方法時,方法的名字、返回類型、參數(shù)個數(shù)及類型必須與接口中的完全一致。接口中的方法被默認(rèn)是public的,所以類在實(shí)現(xiàn)接口方法時,一定要用public來修飾。如果接口方法名有返回類型,那么在類中實(shí)現(xiàn)該接口方法時,方法體至少要有一個return語句;如果接口方法名是void型,類體除了兩個大括號外,可以沒有任何語句。接口也可以被繼承,子接口將繼承父接口中的全部方法和常量。55interfaceComputable{intMAX=100;voidspeak(Strings);intf(intx);}abstractclassAimplementsComputable{publicintf(intx)//不要忘記public關(guān)鍵字{intsum=0;for(inti=1;i<=x;i++){sum=sum+i;}returnsum;}}繼承接口56interface收費(fèi){publicvoid收取費(fèi)用();}class公共汽車implements收費(fèi){publicvoid收取費(fèi)用(){System.out.println("公共汽車:一元/張,不計算公里數(shù)"); }}class出租車implements收費(fèi){publicvoid收取費(fèi)用(){System.out.println("出租車:l.60元/公里,起價3公里");}}class電影院implements收費(fèi){publicvoid收取費(fèi)用(){System.out.println("電影院:門票,十元/張");}}classExample4_26{publicstaticvoidmain(Stringargs[]){公共汽車七路=new公共汽車();出租車天宇=new出租車();電影院紅星=new電影院();七路.收取費(fèi)用();天宇.收取費(fèi)用();紅星.收取費(fèi)用();}}理解接口57interfaceShowMessage{void顯示商標(biāo)(Strings);}classTVimplementsShowMessage{publicvoid顯示商標(biāo)(Strings){System.out.println(s);}}classPCimplementsShowMessage{publicvoid顯示商標(biāo)(Strings){System.out.println(s);}}publicclassExample4_27{publicstaticvoidmain(Stringargs[]){ShowMessagesm;//聲明接口變量

sm=newTV();//接口變量中存放對象的引用

sm.顯示商標(biāo)("長城牌電視機(jī)");//接口回調(diào)

sm=newPC();//接口變量中存放對象的引用

sm.顯示商標(biāo)("聯(lián)想奔月5008PC機(jī)");//接口回調(diào)}}接口回調(diào)58interfaceSpeakHello{voidspeakHello();}classChineseimplementsSpeakHello{publicvoidspeakHello(){System.out.println("中國人習(xí)慣問候語:你好,吃飯了嗎?");}}classEnglishimplementsSpeakHello{publicvoidspeakHello(){System.out.println("英國人習(xí)慣問候語:你好,天氣不錯");}}接口做參數(shù)59classKindHello{publicvoidlookHello(SpeakHellohello){hello.speakHello();}}publicclassExample4_29{publicstaticvoidmain(Stringargs[]){KindHellokindHello=newKindHello();kindHello.lookHello(newChinese());kindHello.lookHello(newEnglish());}}接口做參數(shù)60內(nèi)部類(innerclass)定義在類體內(nèi)聲明另外一個類,該類稱為內(nèi)部類內(nèi)部類也是類的一種成員成員變量、成員方法、內(nèi)部(嵌套)類內(nèi)部類聲明與聲明成員變量、成員方法地位相同,無先后順序。內(nèi)部類的使用外嵌類的類體中可以用內(nèi)部類聲明對象,作為外嵌類的成員。內(nèi)部類中的方法也可以使用外嵌類中的方法。注意:內(nèi)部類的類體不可以聲明類變量和類方法。61classChina{finalStringnationalAnthem="義勇軍進(jìn)行曲";

Beijingbeijing;China(){beijing=newBeijing();}StringgetSong(){returnnationalAnthem;}

classBeijing{Stringname="北京";

voidspeak(){System.out.println("我們是"+name+"我們的國歌是:"+getSong());}}}內(nèi)部類62內(nèi)部類的.class文件

china$beijing.classpublicclassExample4_30{publicstaticvoidmain(Stringargs[]){Chinachina=newChina();

china.beijing.speak();}}內(nèi)部類63匿名類與類有關(guān)的匿名類在創(chuàng)建對象時,除了構(gòu)造方法還有類體說明部分,此類體被認(rèn)為是該類的一個子類去掉類聲明后的類體,稱作匿名類。

newPeople(){

匿名類類體定義}與接口有關(guān)的匿名類直接用接口名和一個類體創(chuàng)建一個匿名對象,此類體被認(rèn)為是實(shí)現(xiàn)了接口的類去掉類聲明后的類體,稱作匿名類。64例子4.31classCubic{doublegetCubic(intn){return0;}}abstractclassSqrt{publicabstractdoublegetSqrt(intx);}classA{voidf(Cubiccubic){doubleresult=cubic.getCubic(3);System.out.println(result);}}匿名類65publicclassExample4_31{publicstaticvoidmain(Stringargs[]){Aa=newA();a.f(newCubic(){doublegetCubic(intn){returnn*n*n;}});Sqrtss=newSqrt(){publicdoublegetSqrt(intx){returnMath.sqrt(x);}};doublem=ss.getSqrt(5);System.out.println(m);}}匿名類66例子4.32interfaceCubic{doublegetCubic(intn);}interfaceSqrt{publicdoublegetSqrt(intx);}classA{voidf(Cubiccubic){doubleresult=cubic.getCubic(3);System.out.println(result);}}與接口有關(guān)的匿名類67publicclassExample4_32{publicstaticvoidmain(Stringargs[]){Aa=newA();a.f(newCubic(){publicdoublegetCubic(intn){returnn*n*n;}});Sqrtss=newSqrt(){publicdoublegetSqrt(intx){returnMath.sqrt(x);}};doublem=ss.getSqrt(5);System.out.println(m);}}與接口有關(guān)的匿名類68Java異常處理編程中有三類錯誤編譯錯誤、運(yùn)行是錯誤、邏輯錯誤什么是異常異常(Exception)是指在程序運(yùn)行過程中發(fā)生的錯誤事件,這類事件的發(fā)生將中斷程序的正常執(zhí)行流程。常見的異常有:

除數(shù)為0、數(shù)組下標(biāo)越界、文件不存在、文件不能打開、內(nèi)存不夠,I/O讀寫錯等

69Java

異常處理類及其子類

類Throwable是java.lang包中一個專門用來處理異常的類位于異常類層次的最頂層,只有它的子類才可以作為一個異常被拋出Object

Throwable

Error

Exception

70異常類(Exception)程序運(yùn)行出現(xiàn)異常時,Java運(yùn)行環(huán)境就用異常類Exception的相應(yīng)子類創(chuàng)建一個異常對象,并等待處理例如,讀取一個不存在的文件時,運(yùn)行環(huán)境就用異常類IOException創(chuàng)建一個對象。異常對象可以調(diào)用如下方法得到或輸出有關(guān)異常的信息:publicStringgetMessage()publicvoidprintStackTrace()publicStringtoString()71異常處理策略1。捕獲異常--使用try-catch-finally處理2。聲明異常--使用throws子句,投遞到其它代碼塊處理(即本代碼塊不處理,由調(diào)用處去捕獲異常)。3。拋出異常

--

使用throw語句72捕獲異常使用try-catch-finally語句俘獲一個或者多個異常語句格式

try{ Java中可能發(fā)生的語句塊 }

catch(異常類型1對象){ 異常對象1處理 }

catch(異常類型2對象){ 異常對象2處理 }...

finally{

最終處理 }73捕獲異常(續(xù))try子句指出它后面的catch語句所俘獲的范圍可能會拋出一個或者多個異常,供catch捕獲catch子句對try塊中生成的異常對象進(jìn)行捕獲,并對該對象進(jìn)行處理Java運(yùn)行系統(tǒng)從上到下分別對每個catch語句處理的異常類型進(jìn)行檢測,找出與類型匹配的catch塊進(jìn)行處理finally語句由finally指出的代碼必須執(zhí)行(不管是否出現(xiàn)異常情況)finally語句在try-catch-finally結(jié)構(gòu)中可以缺省finally語句在try-catch-finally結(jié)構(gòu)中可以缺省74捕獲異常舉例

try{Filef=newFile("E:\\data\\","AA.java");FileInputStreamreadfile=newFileInputStream(f);while((b=readfile.read(tom,0,j))!=-1) {Strings=newString(tom,0,j);System.out.println(s);text.append(s+'\n'); }readfile.close(); }

catch(IOExceptione) {System.out.println("FilereadEroor"); }publicclassExample4_33{publicstaticvoidmain(Stringargs[]){intn=0,m=0,t=555;

try{m=Integer.parseInt("8888")

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論