Java程序開(kāi)發(fā)教學(xué)課件:05-Java的面向?qū)ο筇匦訽第1頁(yè)
Java程序開(kāi)發(fā)教學(xué)課件:05-Java的面向?qū)ο筇匦訽第2頁(yè)
Java程序開(kāi)發(fā)教學(xué)課件:05-Java的面向?qū)ο筇匦訽第3頁(yè)
Java程序開(kāi)發(fā)教學(xué)課件:05-Java的面向?qū)ο筇匦訽第4頁(yè)
Java程序開(kāi)發(fā)教學(xué)課件:05-Java的面向?qū)ο筇匦訽第5頁(yè)
已閱讀5頁(yè),還剩122頁(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)介

Java程序設(shè)計(jì)

-面向?qū)ο筇匦灾卮笥?jì)算機(jī)學(xué)院目錄有關(guān)面向?qū)ο蟮母拍睿ɑ仡櫍㎎ava的類Java的對(duì)象Java的面向?qū)ο筇匦猿橄箢惡徒涌贗nnerClass2回顧面向?qū)ο蟮母拍蠲嫦驅(qū)ο蟪绦蛟O(shè)計(jì)圍繞的幾個(gè)主要概念:抽象數(shù)據(jù)類型類、類型層次(子類),封裝性,繼承性、多態(tài)性對(duì)象,消息和方法3抽象數(shù)據(jù)類型4classCar{intcolor_number;intdoor_number;

intspeed;

voidbrake(){…}voidspeedUp(){…};voidslowDown(){…}}

計(jì)算機(jī)中的對(duì)象的原型

現(xiàn)實(shí)生活中的對(duì)象類什么是類?類是描述對(duì)象的“基本原型”,它定義一種對(duì)象所能擁有的數(shù)據(jù)和能完成的操作,在面向?qū)ο蟮某绦蛟O(shè)計(jì)中,類是程序的基本單元。5

程序中的對(duì)象是類的一個(gè)實(shí)例,是一個(gè)軟件單元,它由一組結(jié)構(gòu)化的數(shù)據(jù)和在其上的一組操作構(gòu)成。variablesmethods變量,方法,消息變量:即指對(duì)象的所知道的狀態(tài)方法:指對(duì)象的功能單元。什么是消息?軟件對(duì)象通過(guò)相互間傳遞消息來(lái)相互作用和通信一個(gè)消息由三部分組成:1.接受消息的對(duì)象2.要完成方法的名字3.方法需要的參數(shù)6對(duì)象B對(duì)象Amessage例子一個(gè)例子在程序中操作對(duì)象是類的一個(gè)實(shí)例:即對(duì)象創(chuàng)建一個(gè)對(duì)象Helloobj=newHello();調(diào)用方法obj.changeString(“HelloWorld!”)7classHello{

}privateStrings;publicvoidshowString()

{System.out.println(s);}publicvoidchangeString(Stringstr){s=str;}封裝什么是封裝?封裝把對(duì)象的所有組成部分組合在一起,封裝定義程序如何引用對(duì)象的數(shù)據(jù),8私有數(shù)據(jù)

方法封裝實(shí)際上是將類的數(shù)據(jù)隱藏起來(lái),控制用戶對(duì)類的修改和訪問(wèn)數(shù)據(jù)的程度。

方法數(shù)據(jù)對(duì)象A對(duì)象B公有數(shù)據(jù)子類什么是子類?子類是作為另一個(gè)類的擴(kuò)充或修正所定義的一個(gè)類.9bicycle(superclass)MountainbikesRacingbikesTandembikessubclass繼承10什么是繼承?繼承是子類利用父類中定義的方法和變量就像它們屬于子類本身一樣.classCar{intcolor_number;intdoor_number;intspeed;

push_break(){…}add_oil(){…}}

classTrash_Car

extendsCar{doubleamount;fill_trash(){…}}重載overload什么是方法的重載(編譯時(shí)多態(tài)性)?在同一個(gè)類中至少有兩個(gè)方法用同一個(gè)名字,但有不同的參數(shù)。11類voidshow(intint_num)voidshow(doubledouble_num)voidshow(nitnit_um,floatfloat_um)1231.23123,1.23方法重寫(xiě)(override,覆蓋)什么是方法的覆蓋(重寫(xiě),動(dòng)態(tài)多態(tài)性)?在子類中重新定義父類中已有的方法。12classCar{intcolor_number;intdoor_number;intspeed;

push_break()

{speed=0;}add_oil(){…}}

classTrash_Car

extendsCar{doubleamount;fill_trash(){…}

push_break(){speed=speed-10;}}Java類定義封裝繼承多態(tài)抽象類接口內(nèi)部類13Java類定義包括類聲明和類體類聲明:

[public][abstract|final]

classclassName

[extendssuperclassName]

[implementsinterfaceNameList]{……}14Java類體classclassName{ [public|protected|private][static][final][transient][volatile]

typevariableName;//成員變量

[public|protected|private][static][final|abstract][native][synchronized]

returnTypemethodName([paramList])[throwsexceptionList]{statements}//成員方法

}15成員變量[public|protected|private][static][final][transient][volatile]

TypevariableName;//成員變量

static:靜態(tài)變量(類變量〕;相對(duì)于實(shí)例變量

final:常量

transient:暫時(shí)性變量,用于對(duì)象存檔(序列化)

volatile:共享變量,用于并發(fā)線程的共享16成員方法[public|protected|private][static][final|abstract][native][synchronized]

returnTypemethodName([paramList])[throwsexceptionList]//方法聲明

{statements}//方法體方法聲明

static:類方法,可通過(guò)類名直接調(diào)用

abstract:抽象方法,沒(méi)有方法體

final:方法不能被重寫(xiě)

native:集成其它語(yǔ)言的代碼

synchronized:控制多個(gè)并發(fā)線程的訪問(wèn)17成員方法(值參傳遞)publicclassPassTest{ floatvalue; publicvoidchangeValue(intvalue){ value=55; } publicvoidchangeObjValue(PassTestref){ ref.value=99f; }18成員方法(值參傳遞)publicstaticvoidmain(Stringargs[]){ intval; PassTestobj=newPassTest(); val=11; System.out.println("OriginalIntValueis:"+val); obj.changeValue(val); System.out.println("IntValueafterChangeis:"+val); obj.value=101f; System.out.println("OriginalptValueis:"+obj.value); obj.changeObjValue(obj); System.out.println("ptValueafterChangeis:"+obj.value); }19成員方法(值參傳遞)運(yùn)行結(jié)果c:\>javaPassTestOriginalIntValueis:11IntValueafterChangeis:11OriginalptValueis:101.0ptValueafterChangeis:99.020成員方法(方法體)方法體包括局部變量的聲明以及所有合法的Java指令。局部變量的作用域在該方法內(nèi)部。若局部變量與類的成員變量同名,則類的成員變量被隱藏。this-----用在一個(gè)方法中引用當(dāng)前對(duì)象,它的值是該方法所在的對(duì)象。返回值須與返回類型一致,或是其子類返回類型是接口時(shí),返回值必須實(shí)現(xiàn)該接口。21成員方法(方法體)-待續(xù)classVariable{intx=0,y=0,z=0;//類的成員變量

voidinit(intx,inty){this.x=x;this.y=y;intz=5;//局部變量,隱藏全局變量

System.out.println(“**ininit**”);System.out.println(“x=”+x+“y=”+y+“z=”+z)}}22成員方法(方法體)-續(xù)1publicclassVariableTest{publicstaticvoidmain(Stringargs[]){Variablev=newVariable();System.out.println(“**beforeinit**”);System.out.println(“x=”+v.x+“y=”+v.y+“z=”+v.z);v.init(20,30);System.out.println(“**afterinit**”);System.out.println(“x=”+v.x+“y=”+v.y+“z=”+v.z);}}23成員方法(方法體)運(yùn)行結(jié)果

c:\>javaVariableTest**beforeinit**x=0y=0z=0**ininit**x=20y=30z=5**afterinit**x=20y=30z=024方法重載(MethodOverloading)方法重載指多個(gè)方法享有相同的方法名區(qū)別在于:參數(shù)類型不同,或個(gè)數(shù)不同;返回類型不能用來(lái)區(qū)分重載的方法。25方法重載例子(1/3)classMethodOverloading{voidreceive(inti){……}voidreceive(intx,inty){……}voidreceive(doubled){……}voidreceive(Strings){……}}26方法重載例子(2/3)publicclassMethodOverloadingTest{publicstaticvoidmain(Stringargs[]){MethodOverloadingmo=newMethodOverloading();mo.receive(1);mo.receive(2,3);mo.receive(12.56);mo.receive(“veryinteresting,isn’tit?”);}}27方法重載例子(3/3)運(yùn)行結(jié)果:c:\>javaMethodOverloadingTestReceiveoneintdatai=1Receivetwointdatasx=2y=3Receiveonedoubledatad=12.56Receiveastrings=veryinteresting,isn’tit?28構(gòu)造方法構(gòu)造方法具有和類名相同的名稱,而且不返回任何數(shù)據(jù)類型構(gòu)造方法只能由new運(yùn)算符調(diào)用利用構(gòu)造方法進(jìn)行初始化構(gòu)造方法不能被繼承重載經(jīng)常用于構(gòu)造方法29構(gòu)造方法例classPoint{intx,y;Point(){x=0;y=0;}Point(intx,inty){this.x=x;this.y=y;}}30finalize()方法在根類java.land.Object中實(shí)現(xiàn)對(duì)對(duì)象進(jìn)行垃圾收集前,系統(tǒng)自動(dòng)調(diào)用自己重寫(xiě)時(shí)需要調(diào)用父類的finalize()方法protectedvoidfinalize()throwsthrowable{……//本類的資源清除代碼

super.finalize();}31Java對(duì)象類實(shí)例化可生成對(duì)象對(duì)象通過(guò)消息傳遞來(lái)進(jìn)行交互消息傳遞即激活指定的某個(gè)對(duì)象的方法以改變其狀態(tài)或讓它產(chǎn)生一定的行為。32對(duì)象的生命周期生成使用清除33對(duì)象的生成包括聲明、實(shí)例化和初始化

typeobjectName=newtype([paramlist]);(1)聲明:typeobjectName

聲明并不為對(duì)象分配內(nèi)存空間,而只是分配一個(gè)引用空間;(2)實(shí)例化:運(yùn)算符new為對(duì)象分配內(nèi)存空間,它調(diào)用對(duì)象的構(gòu)造方法,返回引用;一個(gè)類的不同對(duì)象分別占據(jù)不同的內(nèi)存空間。(3)生成:執(zhí)行構(gòu)造方法,進(jìn)行初始化;根據(jù)參數(shù)不同調(diào)用相應(yīng)的構(gòu)造方法。34對(duì)象的使用對(duì)象的引用指向一個(gè)中間的數(shù)據(jù)結(jié)構(gòu),它存儲(chǔ)有關(guān)數(shù)據(jù)類型的信息以及當(dāng)前對(duì)象所在的堆的地址,而對(duì)于對(duì)象所在的實(shí)際的內(nèi)存地址是不可操作的,這就保證了安全性。通過(guò)運(yùn)算符“.”可以實(shí)現(xiàn)對(duì)變量的訪問(wèn)和方法的調(diào)用。設(shè)定訪問(wèn)權(quán)限來(lái)限制其它對(duì)象對(duì)它的訪問(wèn)35調(diào)用對(duì)象的變量格式:objectReference.variableobjectReference是一個(gè)已生成的對(duì)象,也可以是能生成對(duì)象的表達(dá)式例:p.x=10;tx=newPoint().x;36調(diào)用對(duì)象的方法格式:objectReference.methodName([paramlist]);例如:p.move(30,20);newPoint().move(30,20);使用方法的返回值

if(p.equal(20,30)){…//statementswhenequal}else…//statementswhenunequal37對(duì)象的清除當(dāng)不存在對(duì)一個(gè)對(duì)象的引用時(shí),該對(duì)象成為一個(gè)無(wú)用對(duì)象。對(duì)象的引用=null。System.gc();執(zhí)行后有什么影響:suggeststhattheJavaVirtualMachineexpendefforttowardrecyclingunusedobjectsinordertomakethememorytheycurrentlyoccupyavailableforquickreuse.38面向?qū)ο筇匦苑庋b性繼承性多態(tài)性39封裝性類定義:classclassName{[public|protected|private][static][final]typevariableName;//成員變量

[public|protected|private][static][final|abstract]returnTypemethodName([paramList])[throwsexceptionList]{statements}//成員方法

}40封裝性-類的修飾每個(gè)類都創(chuàng)造了自己的名字空間,指方法和變量可以知道彼此的存在,可以使用。abstract類不能直接產(chǎn)生屬于這個(gè)類的對(duì)象final類不能被其他任何類所繼承(安全的考慮)public類不但可以被同一程序包中的其它類使用,別的程序包中的類也可以使用.缺?。侯愔荒鼙槐景械钠渌愂褂妙惽懊娴脑L問(wèn)修飾字是:public或者“無(wú)”41封裝性-java訪問(wèn)控制變量和方法的修飾字public、protected、privatepublic:任何其它類、對(duì)象只要可以看到這個(gè)類的話,那么它就可以存取變量的數(shù)據(jù),或使用方法。42classABC{publicintpub_i=5;

publicvoidshow(){System.out.println(“pub_i”+pub_i);}封裝性-例子classDemo{publicstaticvoidmain(Stringargs[]){ABCabc=newABC();System.out.println(“abc.pub_i”+abc.pub_i);abc.pub_i=10;abc.show();}}43abc.pub_i=5pub_i=10;封裝性-protectedprotected變量和方法如果一個(gè)類中變量或方法有修飾字protected,同一類,同一包可以使用。不同包的類要使用,必須是該類的子類可以存取變量或調(diào)用44publicclassABC{protectedintpro_i=5;

protectedvoidshow(){System.out.println(“pro_i=”+pro_i;)}}

封裝性-protected同一個(gè)包中的類能使用45classDEF{publicstaticvoidmain(Stringargs[]){ABCabc=newABC();System.out.println(“_i=“+_i);abc.pub_i=10;abc.show();}}封裝性-protected不同包但是是子類46importmytest.pack.ABC;classDEFextendsABC{publicstaticvoidmain(Stringagrs[]){DEFdef=newDEF();System.out.println(_i);_i=10;def.show();}}封裝性private

不允許任何其他類存取和調(diào)用“前邊沒(méi)有修飾字的情況”在同一程序包中出現(xiàn)的類才可以直接使用它的數(shù)據(jù)和方法.47封裝性-修飾符與訪問(wèn)控制同一個(gè)類同一個(gè)包不同包的子類不同包非子類private√空白√√protected√√√public√√√√48繼承性通過(guò)繼承實(shí)現(xiàn)代碼復(fù)用根類:java.lang.Object父類包括直接或者間接被繼承的類Java不支持多重繼承子類不能訪問(wèn)父類中訪問(wèn)權(quán)限為private的成員變量和方法。子類可以重寫(xiě)父類的方法,及命名與父類同名的成員變量49創(chuàng)建子類格式:classSubClassextendsSuperClass{…}50繼承性舉例51繼承性舉例52繼承性舉例53繼承性舉例54重寫(xiě)(override)子類中重寫(xiě)的方法和父類中被重寫(xiě)的方法要具有相同的名字,相同的參數(shù)表和相同的返回類型55重寫(xiě)舉例56成員變量的隱藏和方法的重寫(xiě)classSuperClass{intx;…voidsetX(){x=0;}…}classSubClassextendsSuperClass{intx;//hidexinSuperClass…voidsetX(){//overridemethodsetX()x=5;}….}57Super(1)super用來(lái)引用當(dāng)前對(duì)象的父類(1)訪問(wèn)父類被隱藏的成員變量,如:super.variable;(2)調(diào)用父類中被重寫(xiě)的方法,如:super.Method([paramlist]);(3)調(diào)用父類的構(gòu)造函數(shù),如:super([paramlist]);58Super(2)classSuperClass{intx;SuperClass(){x=3;System.out.println(“inSuperClass:x=“+x);}voiddoSomething(){System.out.println(“inSuperClass.doSomething()”);}}59Super(3)classSubClassextendsSuperClass{intx;SubClass(){super();//callconstructorofsuperclassx=5;//super()要放在方法中的第一句

System.out.println(“inSubClass:x=“+x);}voiddoSomething(){super.doSomething();//callmethodofsuperclassSystem.out.println(“inSubClass.doSomething()”);60Super(4)System.out.println(“super.x=”+super.x+“sub.x=”+x)}}publicclassinheritance{publicstaticvoidmain(Stringargs[]){SubClasssubC=newSubClass();subC.doSomething();}}61Super(5)運(yùn)行結(jié)果c:\>javainheritanceinSuperClass:x=3inSubClass:x=5inSuperClass.doSomething()inSubClass.doSomething()super.x=3sub.x=562多態(tài)性是由封裝性和繼承性引出的面向?qū)ο蟪绦蛟O(shè)計(jì)語(yǔ)言的另一特征。靜態(tài)多態(tài)性(編譯時(shí)多態(tài)〕

由方法重載(overload)實(shí)現(xiàn)動(dòng)態(tài)多態(tài)性(運(yùn)行時(shí)多態(tài))子類對(duì)象可以作為父類對(duì)象使用。在程序中凡是需要父類對(duì)象的地方,都可以用子類對(duì)象代替。由方法重寫(xiě)(override)實(shí)現(xiàn)調(diào)用規(guī)則:根據(jù)實(shí)例的類型決定調(diào)用的方法。63重寫(xiě)方法的調(diào)用規(guī)則classA{voidcallme(){System.out.println(“InsideA’scallme()method”);}}classBextendsA{voidcallme(){System.out.println(“InsideB’scallme()Method”);}}64重寫(xiě)方法的調(diào)用規(guī)則publicclassDispatch{publicstaticvoidmain(Stringargs[]){Aa=newB();a.callme();}}和具體的對(duì)象的類型有關(guān)系65重寫(xiě)方法的調(diào)用規(guī)則運(yùn)行結(jié)果c:\>javaDispatchInsideB’scallme()method66方法重寫(xiě)應(yīng)遵循的原則(1)改寫(xiě)后的方法不能比被重寫(xiě)的方法有更嚴(yán)格的訪問(wèn)權(quán)限(2)改寫(xiě)后的方法不能比重寫(xiě)的方法產(chǎn)生更多的異常67方法重寫(xiě)應(yīng)遵循的原則classParent{publicvoidfunction()}}classChildextendsParent{privatevoidfunction()}}publicclassOverriddenTest{publicstaticvoidmain(Stringargs[]){Parentp1=newParent();Parentp2=newChild();p1.function();p2.function();}}68多態(tài)性的另外一個(gè)例子classSuperClass2{ voidshow(){ this.getName(); } voidgetName(){ System.out.println("SuperClass2"); }}publicclassSubClass2extendsSuperClass2{ voidshow(){ super.show(); this.getName(); } voidgetName(){ System.out.println("SubClass2"); } publicstaticvoidmain(Stringargs[]){ SuperClass2s=newSubClass2(); s.show(); }}69對(duì)象狀態(tài)的確定(instanceof)Manager和Contractor都是Employee的子類publicvoidmethod(Employeee){if(einstanceofManager)…//dosomethingasaManager}elseif(einstanceofContractor){…}//dosomethingasaContractorelse{…//dosomethingelse}}70對(duì)象的類型轉(zhuǎn)換(1)使用instanceof來(lái)測(cè)試一個(gè)對(duì)象的類型。用類型轉(zhuǎn)換來(lái)恢復(fù)一個(gè)對(duì)象的全部功能。用下述提示來(lái)檢查類型轉(zhuǎn)換的正確性:向上的類型轉(zhuǎn)換是隱含地實(shí)現(xiàn)的。向下的類型轉(zhuǎn)換必須針對(duì)子類并由編譯器檢查。在你接收父類的一個(gè)引用時(shí),你可以通過(guò)使用instanceof運(yùn)算符判定該對(duì)象實(shí)際上是你所要的子類,并可以用類型轉(zhuǎn)換該引用的辦法來(lái)恢復(fù)對(duì)象的全部功能。71對(duì)象的類型轉(zhuǎn)換(2)publicvoidmethod(Employeee){if(einstanceofManager){

Managerm=(Manager)e;System.out.println("Thisisthemanagerof"+m.department);}//restofoperation}72對(duì)象的類型轉(zhuǎn)換(3)如果不用強(qiáng)制類型轉(zhuǎn)換,那么引用e.department的嘗試就會(huì)失敗,因?yàn)榫幾g器不能將被稱做department的成員定位在Employee類中。如果不用instanceof做測(cè)試,就會(huì)有類型轉(zhuǎn)換失敗的危險(xiǎn)。通常情況下,類型轉(zhuǎn)換一個(gè)對(duì)象引用的嘗試是要經(jīng)過(guò)幾種檢查的:向上強(qiáng)制類型轉(zhuǎn)換類層次總是允許的,而且事實(shí)上不需要強(qiáng)制類型轉(zhuǎn)換運(yùn)算符??捎珊?jiǎn)單的賦值實(shí)現(xiàn)。對(duì)于向下類型轉(zhuǎn)換,編譯器必須滿足類型轉(zhuǎn)換至少是可能的這樣的條件。比如,任何將Manager引用類型轉(zhuǎn)換成Contractor引用的嘗試是肯定不允許的,因?yàn)镃ontractor不是一個(gè)Manager。類型轉(zhuǎn)換發(fā)生的類必須是當(dāng)前引用類型的子類。如果編譯器允許類型轉(zhuǎn)換,那么,該引用類型就會(huì)在運(yùn)行時(shí)被檢查。比如,如果instanceof檢查從源程序中被省略,而被類型轉(zhuǎn)換的對(duì)象實(shí)際上不是它應(yīng)被類型轉(zhuǎn)換進(jìn)去的類型,那么,就會(huì)發(fā)生一個(gè)運(yùn)行時(shí)錯(cuò)誤(exception)。異常是運(yùn)行時(shí)錯(cuò)誤的一種形式,而且是后面模塊中的主題。73模擬題下面哪些語(yǔ)句是正確的?1)Theinstanceofoperatorcanbeusedtodetermineifareferenceisaninstanceofaclass,butnotaninterface.2)Theinstanceofoperatorcanbeusedtodetermineifareferenceisaninstanceofaparticularprimitivewrapperclass3)Theinstanceofoperatorwillonlydetermineifareferenceisaninstanceofaclassimmediatelyaboveinthehierarchybutnofurtheruptheinheritancechain4)Theinstanceofoperatorcanbeusedtodetermineifonereferenceisofthesameclassasanotherreferencethus74模擬題Answer2)Theinstanceofoperatorcanbeusedtodetermineifareferenceisaninstanceofaparticularprimitivewrapperclass75final關(guān)鍵字(1)final修飾變量,則成為常量

finaltypevariableName;

修飾成員變量時(shí),定義時(shí)同時(shí)給出初始值,而修飾局部變量時(shí)不做要求。(2)final修飾方法,則該方法不能被子類重寫(xiě)

finalreturnTypemethodName(paramList){…}76final關(guān)鍵字(3)final修飾類,則類不能被繼承

finalclassfinalClassName{…}77實(shí)例成員和類成員實(shí)例成員為實(shí)例所有,通過(guò)對(duì)象訪問(wèn);類成員為類所有,不屬于某一個(gè)類,可以通過(guò)類名訪問(wèn)。類成員的格式(static):statictypeclassVar;staticreturnTypeclassMethod({paramlist]){…}78實(shí)例變量和類變量(1)每個(gè)對(duì)象的實(shí)例變量都分配內(nèi)存通過(guò)對(duì)象來(lái)訪問(wèn)這些實(shí)例變量類變量?jī)H在生成第一個(gè)對(duì)象時(shí)分配內(nèi)存,所有實(shí)例對(duì)象共享同一個(gè)類變量。類變量可通過(guò)類名直接訪問(wèn),無(wú)需先生成一個(gè)實(shí)例對(duì)象也可以通過(guò)實(shí)例對(duì)象訪問(wèn)類變量79實(shí)例變量和類變量(2)80classVars{chardata;

staticint_share_data;}classDemo{Varsa,b,c,d}objectbchardataobjectcchardataObjectbchardatastaticintshare_dataobjectbchardata實(shí)例方法和類方法(1)類方法不能訪問(wèn)實(shí)例變量,只能訪問(wèn)類變量類方法可以由類名直接調(diào)用類方法中不能使用this或super81實(shí)例方法和類方法(2)classmember{staticintclassVar;intinstanceVar;staticvoidsetClassVar(inti){classVar=i;//instanceVar=i;//can’taccessnostaticmember}82實(shí)例方法和類方法(3)staticintgetClassVar(){returnclassVar;}voidsetInstanceVar(inti){classVar=i;//canaccessstaticmemberinstanceVar=i;}intgetInstanceVar(){returninstanceVar;}}83實(shí)例方法和類方法(4)publicclassmemberTest{publicstaticvoidmain(Stringargs[]){memberm1=newmember();memberm2=newmember();m1.setClassVar(1);m2.setClassVar(2);System.out.println(“m1.classVar=”+m1.getClassVar()+“m2.ClassVar=”+m2.getClassVar());m1.setInstanceVar(11);

84實(shí)例方法和類方法(5)m2.setInstanceVar(22);System.out.println(“m1.InstanceVar=”+m1.getInstanceVar()+“m2.InstanceVar=”+m2.getInstanceVar());}}85實(shí)例方法和類方法(6)運(yùn)行結(jié)果c:\>javamemberTestm1.classVar=2m2.classVar=2m1.InstanceVar=11m2.InstanceVar=2286模擬題下面哪些語(yǔ)句是正確的?1)staticmethodsdonothaveaccesstotheimplicitvariablecalledthis2)Astaticmethodmaybecalledwithoutcreatinganinstanceofitsclass3)Astaticmethodmaynotbeoverridentobenon-static4)Astaticmethodmaynotbeoverloaded87模擬考題答案1)staticmethodsdonothaveaccesstotheimplicitvariablecalledthis2)Astaticmethodmaybecalledwithoutcreatinganinstanceofitsclass3)astaticmaynotbeoverridentobenon-static88練習(xí)題寫(xiě)出輸出結(jié)果:classVehicle{publicvoiddrive(){ System.out.println("Vehicle:drive");}}classCarextendsVehicle{publicvoiddrive(){ System.out.println("Car:drive");}}publicclassCarTest{ publicstaticvoidmain(Stringargs[]){ Vehiclev;Carc; v=newVehicle(); c=newCar(); v.drive();c.drive(); v=c;v.drive(); }}89練習(xí)題寫(xiě)出輸出結(jié)果:classMammal{Mammal(){System.out.println("Four");}publicvoidears(){System.out.println("Two");}}classDogextendsMammal{Dog(){super.ears();System.out.println("Three");}}publicclassHotdogextendsDog{publicstaticvoidmain(Stringargv[]){System.out.println("One");HotDoghdog=newHotdog();}}90類java.lang.Object該類定義了一些所有對(duì)象最基本的狀態(tài)和行為equals():比較兩個(gè)對(duì)象(引用)是否相同,如果相同返回true,否則返回false。相當(dāng)于操作符“==”;getClass():返回對(duì)象運(yùn)行時(shí)所對(duì)應(yīng)的類的表示,從而可得到相應(yīng)的信息,例如,運(yùn)行時(shí)取得聲稱對(duì)象的類的名稱,obj.getClass().getName()clone(),創(chuàng)建和返回一個(gè)對(duì)象的拷貝,Cloneable接口91類java.lang.ObjecthashCode():返回一個(gè)對(duì)象的hash編碼,同一個(gè)對(duì)象,在任何時(shí)候,都返回同一個(gè)值,在hashTable中使用。toString(),返回對(duì)象的字符串表示。getClass().getName()+'@'+Integer.toHexString(hashCode())finalize(),用于在垃圾收集前清除對(duì)象。notify(),notifyAll(),wait(),用于多線程處理中的同步。92Java.lang.Class一個(gè)特殊的類,沒(méi)有public構(gòu)造函數(shù)。當(dāng)類被裝入時(shí),它的對(duì)象由JVM自動(dòng)生成。Class的對(duì)象描述java程序運(yùn)行中使用的類或者接口。常用的方法有static

ClassforName(String

className)

StringgetName()

ObjectnewInstance()實(shí)時(shí)程序演示93補(bǔ)充一個(gè)練習(xí)題classSuperClass3{voidshow(){System.out.println(this.getClass().getName());}}classSubClass3extendsSuperClass3{voidshow(){super.show();System.out.println(this.getClass().getSuperclass().getName());}

publicstaticvoidmain(Stringargs[]){SuperClass3s=newSubClass3();s.show();}}94java.lang.Class其他方法返回公有成員getFieldsgetMethodsgetConstructors返回所有成員getdeclaredFieldsgetDeclaredMethodsgetDeclaredConstructors示例程序95Class其他用法使用Class動(dòng)態(tài)創(chuàng)建toString函數(shù)使用反射獲取成員變量的值調(diào)用方法使用反射調(diào)用成員方法96抽象類用abstract來(lái)修飾類或方法

abstractclassabstractClass{…}abstractreturnTypeabstractMethod([paramlist])抽象類不能被實(shí)例化,它的子類可以實(shí)現(xiàn)抽象方法。抽象方法只需聲明,無(wú)需實(shí)現(xiàn);抽象類不一定要包含抽象方法,若類中包含了抽象方法,則該類必須被定義為抽象類可以把抽象類作為變量的類型。97接口接口類似抽象類,只包含常量和方法的定義,而沒(méi)有變量和方法的實(shí)現(xiàn)(可以實(shí)現(xiàn)靜態(tài)方法JDK8)interfaceCollection{intMAX_NUM=100;voidadd(Objectobj);voiddelete(Objectobj);Objectfind(Objectobj);}98接口定義包括接口聲明和接口體[public]interface接口名[extends父接口]{…}接口體包括常量定義和方法定義常量定義:typeNAME=value;該常量被實(shí)現(xiàn)該接口的多個(gè)類共享;具有public,final,static的屬性.方法體定義具有public和abstract屬性99接口的實(shí)現(xiàn)在類的聲明中用implements子句來(lái)表示一個(gè)類使用某個(gè)接口.一個(gè)類可以實(shí)現(xiàn)多個(gè)接口,在implements子句中用逗號(hào)分開(kāi)必須實(shí)現(xiàn)接口中定義的所有方法,否則該類是抽象類100接口的實(shí)現(xiàn)classFIFOQueueimplementscollection{publicvoidadd(Objectobj){…}publicvoiddelete(Objectobj){…}publicObjectfind(Objectobj){…}publicintcurrentCount{…}}101接口用處通過(guò)接口實(shí)現(xiàn)不相關(guān)類的相同行為,無(wú)需考慮這些類之間的關(guān)系.通過(guò)接口指明多個(gè)類需要實(shí)現(xiàn)的方法通過(guò)接口了解對(duì)象的交互界面,而無(wú)需了解對(duì)象所對(duì)應(yīng)的類102接口例子103接口例子104一個(gè)類實(shí)現(xiàn)多個(gè)接口的例子105接口類型的使用作為一種引用類型來(lái)使用任何實(shí)現(xiàn)該接口的類的實(shí)例都是該接口類型的變量通過(guò)這些變量可以訪問(wèn)類所實(shí)現(xiàn)的接口中的方法106接口類型的使用classInterfaceType{publicstaticvoidmain(Stringargs[]){Collectionc=newFIFOQueue();…c.add(obj);…}}107模擬題下面哪些語(yǔ)句是正確的?1)Aninterfacecanonlycontainmethodandnotvariables2)Interfacescannothaveconstructors3)Aclassmayextendonlyoneotherclassandimplementonlyoneinterface4)InterfacesaretheJavaapproachtoaddressingitslackofmultipleinheritance,butrequireimplementingclassestocreatethefunctionalityoftheInterfaces.108模擬題答案2)Interfacescannothaveconstructors4)InterfacesaretheJavaapproachtoaddressingthesingleinheritancemodel,butrequireimplementingclassestocreatethefunctionalityoftheInterfaces.109NestedClass(InnerClass)嵌套類:在一個(gè)類的內(nèi)部嵌套定義類,三種定義方式(1)是其它類的成員。(2)在一個(gè)語(yǔ)句塊的內(nèi)部定義(3)在表達(dá)式內(nèi)部匿名定義NestedClass:更多的是反映的是類之間的關(guān)系。InnerClass:更多的反映的是對(duì)象之間的關(guān)系110NestedClass特性:(1)一般用在定義它的類或語(yǔ)句塊之內(nèi),在外部引用它時(shí)必須給出完整的名稱.名字不能與包含它的類名相同(2)可以使用包含它的類的靜態(tài)和實(shí)例成員變量,也可以使用它所在方法(或語(yǔ)句塊)的final局部變量。(3)可以定義為abstract,可以是接口。(4)可以聲明為private或protected111NestedClass(5)若被聲明為static,就變成了頂層類,不能再使用局部變量,(staticnestedclass)(6)若想在NestedClass中聲明任何static成員,則該NestedClass必須聲明為staticNestedClass一般用來(lái)生成事件適配器,用于事件處理112一個(gè)例子(InnerClass)classEnclosingClass{...classANestedClass{...}}可以訪問(wèn)外部類的實(shí)例變量113另一個(gè)例子classE

溫馨提示

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