第三章-3面向?qū)ο缶幊蘝第1頁(yè)
第三章-3面向?qū)ο缶幊蘝第2頁(yè)
第三章-3面向?qū)ο缶幊蘝第3頁(yè)
第三章-3面向?qū)ο缶幊蘝第4頁(yè)
第三章-3面向?qū)ο缶幊蘝第5頁(yè)
免費(fèi)預(yù)覽已結(jié)束,剩余93頁(yè)可下載查看

下載本文檔

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

文檔簡(jiǎn)介

JavaSE知識(shí)圖解JAVA發(fā)展歷程JAVA環(huán)境搭建基礎(chǔ)程序設(shè)計(jì)數(shù)據(jù)類型流程控制運(yùn)算符數(shù)組面向?qū)ο缶幊填惡蛯?duì)象屬性方法設(shè)計(jì)模式接口三大特性應(yīng)用程序開(kāi)發(fā)JDBC集合異常處理類庫(kù)多線程IO反射網(wǎng)絡(luò)連接OracleJAVA新特性Eclipse使用泛型枚舉裝箱/拆箱可變參數(shù)Annotation學(xué)習(xí)面向?qū)ο髢?nèi)容的三條主線1.java類及類的成員2.面向?qū)ο蟮娜筇卣?.其它關(guān)鍵字學(xué)習(xí)內(nèi)容3.1面向?qū)ο笈c面向過(guò)程3.2java語(yǔ)言的基本元素:類和對(duì)象3.3類的成員之一:屬性3.4類的成員之二:方法3.5對(duì)象的創(chuàng)建和使用3.6再談方法3.7面向?qū)ο筇卣髦唬悍庋b和隱藏3.8類的成員之三:構(gòu)造器(構(gòu)造方法)3.9幾個(gè)關(guān)鍵字:this、package、import何謂“面向?qū)ο蟆钡木幊趟枷??頓悟?OR漸悟?3.1面向?qū)ο笈c面向過(guò)程面向?qū)ο?OOP)與面向過(guò)程二者都是一種思想,面向?qū)ο笫窍鄬?duì)于面向過(guò)程而言的。面向過(guò)程,強(qiáng)調(diào)的是功能行為。面向?qū)ο?,將功能封裝進(jìn)對(duì)象,強(qiáng)調(diào)具備了功能的對(duì)象。面向?qū)ο蟾訌?qiáng)調(diào)運(yùn)用人類在日常的思維邏輯中采用的思想方法與原則,如抽象、分類、繼承、聚合、多態(tài)等。面向?qū)ο蟮娜筇卣鞣庋b(Encapsulation)繼承(Inheritance)多態(tài)(Polymorphism)

OOP:ObjectOrientedProgramming面向過(guò)程:procedureorientedprogramming例子:人把大象裝冰箱面向過(guò)程1.打開(kāi)冰箱2.把大象裝進(jìn)冰箱3.把冰箱門關(guān)住面向?qū)ο笕吮浯笙笕藍(lán)

打開(kāi)(冰箱){

冰箱.開(kāi)門(); }

操作(大象){

大象.進(jìn)入();}

關(guān)閉(冰箱){

冰箱.關(guān)門();}}冰箱{

開(kāi)門(){}關(guān)門(){}}大象{

進(jìn)入(){}}類與類之間的關(guān)系關(guān)聯(lián)關(guān)系繼承關(guān)系類與類之間的關(guān)系聚集組合聚合關(guān)系面向?qū)ο蟮乃枷敫攀龀绦騿T從執(zhí)行者轉(zhuǎn)化成了指揮者。完成需求時(shí):先去找具有所需功能的對(duì)象來(lái)用。如果該對(duì)象不存在,那么創(chuàng)建一個(gè)具有所需功能的對(duì)象。這樣簡(jiǎn)化開(kāi)發(fā)并提高復(fù)用。類(class)和對(duì)象(object)是面向?qū)ο蟮暮诵母拍睢n愂菍?duì)一類事物描述,是抽象的、概念上的定義對(duì)象是實(shí)際存在的該類事物的每個(gè)個(gè)體,因而也稱實(shí)例(instance)。

“萬(wàn)事萬(wàn)物皆對(duì)象”java類及類的成員現(xiàn)實(shí)世界萬(wàn)事萬(wàn)物是由分子、原子構(gòu)成的。同理,Java代碼世界是由諸多個(gè)不同功能的類構(gòu)成的?,F(xiàn)實(shí)世界中的分子、原子又是由什么構(gòu)成的呢?原子核、電子!那么,Java中用類class來(lái)描述事物也是如此屬性:對(duì)應(yīng)類中的成員變量行為:對(duì)應(yīng)類中的成員方法Field=屬性=成員變量,Method=(成員)方法=函數(shù)可以理解為:類=汽車設(shè)計(jì)圖;對(duì)象=實(shí)實(shí)在在的汽車面向?qū)ο蟪绦蛟O(shè)計(jì)的重點(diǎn)是類的設(shè)計(jì)定義類其實(shí)是定義類中的成員(成員變量和成員方法)面向?qū)ο蟮乃枷敫攀?.java類及類的成員類的成員構(gòu)成version1.0類的成員構(gòu)成verson2.01.我要開(kāi)車去麗江,這句話包含的類和方法有什么?2.體會(huì)以下幾個(gè)經(jīng)典案例涉及到的類和方法。人在黑板上畫圓列車司機(jī)緊急剎車售貨員統(tǒng)計(jì)收獲小票的金額你把門關(guān)上了3.抽象出下面系統(tǒng)中的“類”及其關(guān)系。旅行社預(yù)訂機(jī)票準(zhǔn)備機(jī)票航班目錄記賬記賬文件旅客類的語(yǔ)法格式修飾符

class

類名{

屬性聲明;

方法聲明;}說(shuō)明:修飾符public:類可以被任意訪問(wèn) 類的正文要用{}括起來(lái)舉例:

publicclassPerson{privateintage;

//聲明私有變量age

publicvoidshowAge(inti){//聲明方法showAge()

age=i;}}創(chuàng)建Java自定義類步驟:定義類(考慮修飾符、類名)編寫類的屬性(考慮修飾符、屬性類型、屬性名、初始化值)編寫類的方法(考慮修飾符、返回值類型、方法名、形參等)練習(xí):定義Person、Animal、ClassRoom、Zoo等類,加以體會(huì)。3.3類的成員之一:屬性語(yǔ)法格式:修飾符

類型

屬性名

=初值

;說(shuō)明:修飾符private:該屬性只能由該類的方法訪問(wèn)。

修飾符public:該屬性可以被該類以外的方法訪問(wèn)。

類型:任何基本類型,如int、boolean或任何類。舉例:publicclassPerson{privateintage;//聲明private變量age

publicStringname=“Lila”;//聲明public變量name}補(bǔ):變量的分類:成員變量與局部變量在方法體外,類體內(nèi)聲明的變量稱為成員變量。在方法體內(nèi)部聲明的變量稱為局部變量。注意:二者在初始化值方面的異同:

同:都有生命周期

異:局部變量除形參外,需顯式初始化。成員變量局部變量實(shí)例變量(不以static修飾)類變量(以static修飾)形參(方法簽名中定義的變量)方法局部變量(在方法內(nèi)定義)代碼塊局部變量(在代碼塊內(nèi)定義)所有變量成員變量(屬性)和局部變量的區(qū)別?成員變量:成員變量定義在類中,在整個(gè)類中都可以被訪問(wèn)。成員變量分為類成員變量和實(shí)例成員變量,實(shí)例變量存在于對(duì)象所在的堆內(nèi)存中。成員變量有默認(rèn)初始化值。成員變量的權(quán)限修飾符可以根據(jù)需要,選擇任意一個(gè)局部變量:局部變量只定義在局部范圍內(nèi),如:方法內(nèi),代碼塊內(nèi)等。局部變量存在于棧內(nèi)存中。作用的范圍結(jié)束,變量空間會(huì)自動(dòng)釋放。局部變量沒(méi)有默認(rèn)初始化值,每次必須顯式初始化。局部變量聲明時(shí)不指定權(quán)限修飾符3.4類的成員之二:方法語(yǔ)法格式:

修飾符

返回值類型

方法名

(

參數(shù)列表){

方法體語(yǔ)句;}說(shuō)明:修飾符:public,private,protected等。 返回值類型:return語(yǔ)句傳遞返回值。沒(méi)有返回值:void。舉例:

publicclassPerson{privateintage;publicintgetAge(){returnage;}//聲明方法getAge

publicvoidsetAge(inti){//聲明方法setAge

age=i;

//將參數(shù)i的值賦給類的成員變量age

}}java類及類的成員java類的實(shí)例化,即創(chuàng)建類的對(duì)象如何使用java類?3.5對(duì)象的創(chuàng)建和使用棧堆Animalanimal=newAnimal();="花花";animal.age=2;int[]arr=newint[5];arr[0]=10;凡是new出來(lái)的內(nèi)容0x2332animal:0x2332name:nullage:0花花2Animalanimal1=animal;animal1:0x2332Animalanimal2=newAnimal();="皮皮";animal2.age=5;animal2:0x1234name:皮皮age:50x1234對(duì)象的引用i:27n:皮皮魯皮皮魯Person{Stringname=“Peter”;intage;publicvoidaddAge(){inti=2;age=age+i;}main(){Personp=newPerson();=“Lily”;p.addAge();Personp1=newPerson();}}棧堆p:0x3423newPerson();0x3423Stringname=“Peter”;intage=0;Lilyi=22p1:0x34330x3433Stringname=“Peter”;intage=0;Animala1=newAnimal();="花花";a1.age=3;棧:對(duì)象的引用;局部變量堆:new出來(lái)的東西(包含成員變量)a1:0x5566newAnimal();0x5566name:nullage:0花花3Animala2=newAnimal();a2:0x57760x5776name:nullage:0a3:0x5566Animala3=a1;Personp1=newPerson();p1.setName("付昊");p1:newPerson();name:nullage:0sex:false10n:付昊付昊對(duì)象的創(chuàng)建和使用使用new+構(gòu)造器創(chuàng)建一個(gè)新的對(duì)象;使用“對(duì)象名.對(duì)象成員”的方式訪問(wèn)對(duì)象成員(包括屬性和方法);publicclassAnimal{publicintlegs; publicvoideat(){System.out.println(“Eating.”);}publicviodmove(){System.out.println(“Move.”);}}舉例:publicclassZoo{publicstaticvoidmain(Stringargs[]){

Animalxb=newAnimal(); xb.legs=4; System.out.println(xb.legs); xb.eat(); xb.move();}}Java類數(shù)據(jù)1…… 數(shù)據(jù)n方法1……方法n屬性方法Animallegseat()move()數(shù)據(jù)(屬性)方法類名xh:Animallegs=0eat()move()xb:Animallegs=4eat()move()newAnimal()newAnimal()舉例Java中類與對(duì)象曰:“白馬非馬,可乎?”曰:“可。”曰:“何哉?”曰:“馬者,所以命形也。白者,所以命色也。命色者,非命形也,故曰白馬非馬?!睂?duì)象的創(chuàng)建和使用如果創(chuàng)建了一個(gè)類的多個(gè)對(duì)象,對(duì)于類中定義的屬性,每個(gè)對(duì)象都擁有各自的一套副本,且互不干擾。舉例:publicclassZoo{publicstaticvoidmain(Stringargs[]){

Animalxb=newAnimal(); Animalxh=newAnimal(); xb.legs=4; xh.legs=0; System.out.println(xb.legs);//4 System.out.println(xh.legs);//0 xb.legs=2; System.out.println(xb.legs);//2 System.out.println(xh.legs);//0}}animal:nullanimal2:legs:0name:花花weight:30legs:0name:小白weight:20animal3:0x1234編寫教師類和學(xué)生類,并通過(guò)測(cè)試類創(chuàng)建對(duì)象進(jìn)行測(cè)試學(xué)生類屬性:姓名年齡參加的課程興趣方法:顯示學(xué)生的個(gè)人信息教師類屬性:姓名專業(yè)教授的課程教齡方法:顯示教師的個(gè)人信息練習(xí)1提示類的訪問(wèn)機(jī)制:在一個(gè)類中的訪問(wèn)機(jī)制:類中的方法可以直接訪問(wèn)類中的成員變量。(例外:static方法訪問(wèn)非static,編譯不通過(guò)。)在不同類中的訪問(wèn)機(jī)制:先創(chuàng)建要訪問(wèn)類的對(duì)象,再用對(duì)象訪問(wèn)類中定義的成員。對(duì)象的產(chǎn)生classPerson{ intage; voidshout(){ System.out.println(“oh,mygod!Iam”+age); }}Personp1=newPerson();執(zhí)行完后的內(nèi)存狀態(tài)對(duì)象的產(chǎn)生

當(dāng)一個(gè)對(duì)象被創(chuàng)建時(shí),會(huì)對(duì)其中各種類型的成員變量自動(dòng)進(jìn)行初始化賦值。除了基本數(shù)據(jù)類型之外的變量類型都是引用類型,如上面的Person及前面講過(guò)的數(shù)組。成員變量類型初始值byte0short0int0long0Lfloat0.0Fdouble0.0Dchar‘\u0000’(表示為空)booleanfalse引用類型null對(duì)象的使用classTestPerson{ publicstaticvoidmain(String[]args){//程序運(yùn)行的內(nèi)存布局如下圖

Personp1=newPerson(); Personp2=newPerson(); p1.age=-30; p1.shout(); p2.shout(); }}對(duì)象的生命周期根據(jù)代碼,畫出內(nèi)存圖classCar{Stringcolor="red";intnum=4;voidshow(){ System.out.println("color="+color+"..num="+num);}

}classTestCar{ publicstaticvoidmain(String[]args){

Carc1=newCar();

//建立對(duì)象c1 Carc2=newCar();

//建立對(duì)象c2

c1.color="blue";

//對(duì)對(duì)象的屬性進(jìn)行修改

c1.show();

//使用對(duì)象的方法 c2.show();

}}對(duì)象內(nèi)存結(jié)構(gòu)Carc1=newCar();

c1.color="blue";Carc2=newCar();heapc10x0034c20x00780x00340x0078newCar()newCar()color="red"num=4color="red"num=4"blue"匿名對(duì)象我們也可以不定義對(duì)象的句柄,而直接調(diào)用這個(gè)對(duì)象的方法。這樣的對(duì)象叫做匿名對(duì)象。如:newPerson().shout();使用情況如果對(duì)一個(gè)對(duì)象只需要進(jìn)行一次方法調(diào)用,那么就可以使用匿名對(duì)象。我們經(jīng)常將匿名對(duì)象作為實(shí)參傳遞給一個(gè)方法調(diào)用。練習(xí)21.創(chuàng)建一個(gè)Person類,其定義如下:Personname:Stringage:intsex:int+study():void+showAge():void+addAge():int要求:(1)創(chuàng)建Person類的對(duì)象,設(shè)置該對(duì)象的name、age和sex屬性,調(diào)用study方法,輸出字符串“studying”,調(diào)用showAge()方法顯示age值,調(diào)用addAge()方法給對(duì)象的age屬性值增加2歲。(2)創(chuàng)建第二個(gè)對(duì)象,執(zhí)行上述操作,體會(huì)同一個(gè)類的不同對(duì)象之間的關(guān)系。2.利用面向?qū)ο蟮木幊谭椒?,設(shè)計(jì)類Circle計(jì)算圓的面積。3.6再談方法(method)什么是方法(函數(shù))?方法是類或?qū)ο笮袨樘卣鞯某橄?,也稱為函數(shù)。

Java里的方法不能獨(dú)立存在,所有的方法必須定義在類里。

修飾符

返回值類型方法名(參數(shù)類型形參1,參數(shù)類型形參2,….){程序代碼

return返回值;}其中:形式參數(shù):在方法被調(diào)用時(shí)用于接收外部傳入的數(shù)據(jù)的變量。參數(shù)類型:就是該形式參數(shù)的數(shù)據(jù)類型。返回值:方法在執(zhí)行完畢后返還給調(diào)用它的程序的數(shù)據(jù)。返回值類型:方法要返回的結(jié)果的數(shù)據(jù)類型。實(shí)參:調(diào)用方法時(shí)實(shí)際傳給函數(shù)形式參數(shù)的數(shù)據(jù)。如何理解方法返回值類型為void的情況

?方法的調(diào)用方法只有被調(diào)用才會(huì)被執(zhí)行方法調(diào)用的過(guò)程分析方法的調(diào)用注意:沒(méi)有具體返回值的情況,返回值類型用關(guān)鍵字void表示,那么該函數(shù)中的return語(yǔ)句如果在最后一行可以省略不寫。定義方法時(shí),方法的結(jié)果應(yīng)該返回給調(diào)用者,交由調(diào)用者處理。方法中只能調(diào)用方法,不可以在方法內(nèi)部定義方法。面向?qū)ο笏枷搿奥涞亍狈▌t(一)1.關(guān)注于類的設(shè)計(jì),即設(shè)計(jì)類的成員:屬性、方法2.類的實(shí)例化,即創(chuàng)建類的對(duì)象(比如:Personp=newPerson())3.通過(guò)“對(duì)象.屬性”、“對(duì)象.方法”執(zhí)行方法的重載(overload)重載的概念在同一個(gè)類中,允許存在一個(gè)以上的同名方法,只要它們的參數(shù)個(gè)數(shù)或者參數(shù)類型不同即可。重載的特點(diǎn):與返回值類型無(wú)關(guān),只看參數(shù)列表,且參數(shù)列表必須不同。(參數(shù)個(gè)數(shù)或參數(shù)類型)。調(diào)用時(shí),根據(jù)方法參數(shù)列表的不同來(lái)區(qū)別。重載示例://返回兩個(gè)整數(shù)的和

intadd(intx,inty){returnx+y;}//返回三個(gè)整數(shù)的和

intadd(intx,inty,intz){returnx+y+z;}//返回兩個(gè)小數(shù)的和

doubleadd(doublex,doubley){returnx+y;}publicclassPrintStream{publicstaticvoidprint(inti){……}publicstaticvoidprint(floatf){……}privatestaticvoidprint(Strings){……} publicstaticvoidmain(String[]args){ print(3); print(1.2f); print(“hello!”);

}}函數(shù)的重載練習(xí)31.判斷:與voidshow(inta,charb,doublec){}構(gòu)成重載的有:voidshow(intx,chary,doublez){}//nointshow(inta,doublec,charb){}//yesc)voidshow(inta,doublec,charb){}//yesd)booleanshow(intc,charb){}//yese)voidshow(doublec){}//yesf)doubleshow(intx,chary,doublez){}//nog)voidshows(){doublec}//no練習(xí)32.編寫程序,定義三個(gè)重載方法并調(diào)用。方法名為mOL。三個(gè)方法分別接收一個(gè)int參數(shù)、兩個(gè)int參數(shù)、一個(gè)字符串參數(shù)。分別執(zhí)行平方運(yùn)算并輸出結(jié)果,相乘并輸出結(jié)果,輸出字符串信息。在主類的main()方法中分別用參數(shù)區(qū)別調(diào)用三個(gè)方法。3.定義三個(gè)重載方法max(),第一個(gè)方法求兩個(gè)int值中的最大值,第二個(gè)方法求兩個(gè)double值中的最大值,第三個(gè)方法求三個(gè)double值中的最大值,并分別調(diào)用三個(gè)方法。體會(huì)可變個(gè)數(shù)的形參//下面采用數(shù)組形參來(lái)定義方法publicstaticvoidtest(inta,String[]books);//以可變個(gè)數(shù)形參來(lái)定義方法publicstaticvoidtest(inta,String…books);說(shuō)明:1.可變參數(shù):方法參數(shù)部分指定類型的參數(shù)個(gè)數(shù)是可變多個(gè)2.聲明方式:方法名(參數(shù)的類型名...參數(shù)名)3.可變參數(shù)方法的使用與方法參數(shù)部分使用數(shù)組是一致的4.方法的參數(shù)部分有可變形參,需要放在形參聲明的最后體會(huì)可變個(gè)數(shù)的形參publicvoidtest(String[]msg){ System.out.println(“含字符串?dāng)?shù)組參數(shù)的test方法");}publicvoidtest1(Stringbook){ System.out.println(“****與可變形參方法構(gòu)成重載的test1方法****");} publicvoidtest1(String...books){ System.out.println("****形參長(zhǎng)度可變的test1方法****");}publicstaticvoidmain(String[]args){ TestOverloadto=newTestOverload(); //下面兩次調(diào)用將執(zhí)行第二個(gè)test方法

to.test1(); to.test1("aa","bb"); //下面將執(zhí)行第一個(gè)test方法

to.test(newString[]{"aa"});}方法的參數(shù)傳遞方法,必須有其所在類或?qū)ο笳{(diào)用才有意義。若方法含有參數(shù):形參:方法聲明時(shí)的參數(shù)實(shí)參:方法調(diào)用時(shí)實(shí)際傳給形參的參數(shù)值Java的實(shí)參值如何傳入方法呢?Java里方法的參數(shù)傳遞方式只有一種:值傳遞。即將實(shí)際參數(shù)值的副本(復(fù)制品)傳入方法內(nèi),而參數(shù)本身不受影響。newTestArgsTransfer()tt:i:10j:5inttemp=i;i=j;j=temp;temp:10510newTestArgsTransfer()tt:i:10j:5publicvoidswap(inti,intj){inttemp=i;i=j;j=temp;}i:10j:5mainswaptemp:10510newTestArgsTransfer()tt:

newDataSwap()i:10j:50x8899ds:0x8899d:0x8899publicvoidswap(DataSwapd){inttemp=d.i;d.i=d.j;d.j=temp;}temp:10510方法的參數(shù)傳遞

—基本數(shù)據(jù)類型的參數(shù)傳遞

方法的參數(shù)傳遞

—引用數(shù)據(jù)類型的參數(shù)傳遞方法的參數(shù)傳遞

—引用數(shù)據(jù)類型的參數(shù)傳遞方法的參數(shù)傳遞publicclassTestTransfer{ publicstaticvoidswap(inta,intb){ inttmp=a; a=b; b=tmp; System.out.println("swap方法里,a的值是" +a+";b的值是"+b); } publicstaticvoidmain(String[]args){ inta=6; intb=9; swap(a,b); System.out.println("交換結(jié)束后,變量a的值是" +a+";變量b的值是"+b);}}請(qǐng)輸出結(jié)果方法的參數(shù)傳遞classDataSwap{ publicinta; publicintb;}publicclassTestTransfer1{ publicstaticvoidswap(DataSwapds){

inttmp=ds.a; ds.a=ds.b; ds.b=tmp; System.out.println("swap方法里,aField的值是" +ds.a+";bField的值是"+ds.b); } publicstaticvoidmain(String[]args){ DataSwapds=newDataSwap(); ds.a=6; ds.b=9; swap(ds); System.out.println("交換結(jié)束后,aField的值是" +ds.a+";bField的值是"+ds.b); }}請(qǐng)輸出結(jié)果mainswapa=5b=10i=10j=5temp=5tav:d:0x1234a=5;b=10;data:0x1234105classValue{inti=15;}classTest{publicstaticvoidmain(Stringargv[]){Testt=newTest();t.first();}publicvoidfirst(){inti=5;Valuev=newValue();v.i=25;second(v,i);System.out.println(v.i);}publicvoidsecond(Valuev,inti){i=0;v.i=20;Valueval=newValue();v=val;System.out.println(v.i+""+i);}}t:newTest()i:5v:0x1234newValue()0x1234i:1525v:0x1234i:5second020val:0x2233newValue()i:150x22330x2233classBirthDate{ privateintday; privateintmonth; privateintyear; publicBirthDate(intd,intm,inty){ day=d;month=m;year=y;} publicvoidsetDay(intd){day=d;} publicvoidsetMonth(intm){month=m;} publicvoidsetYear(inty){year=y;} publicintgetDay(){returnday;} publicintgetMonth(){returnmonth;} publicintgetYear(){returnyear;} publicvoiddisplay(){ System.out.println(day+"-"+month+"-"+year);}}再體會(huì)參數(shù)的傳遞publicclassTest{ publicvoidchange1(inti){ i=1234;} publicvoidchange2(BirthDateb){ b=newBirthDate(22,3,2004);} publicvoidchange3(BirthDateb){ b.setDay(22);} publicstaticvoidmain(String[]args){ Testtest=newTest(); intdate=9; BirthDated1=newBirthDate(7,7,1970); BirthDated2=newBirthDate(1,1,2009); test.change1(date); test.change2(d1); test.change3(d2); System.out.println("date="+date); d1.display(); d2.display(); } }test:0x1234date:9d1:0x2233day=0month=0year=0d:7m:7y:1970771970d2:0x3344day=1month=1year=2009i:91234b:0x2553day=22month=3year=2004b:0x3344d:22223.7面向?qū)ο筇卣髦唬悍庋b和隱藏使用者對(duì)類內(nèi)部定義的屬性(對(duì)象的成員變量)的直接操作會(huì)導(dǎo)致數(shù)據(jù)的錯(cuò)誤、混亂或安全性問(wèn)題。publicclassAnimal{ publicintlegs; publicvoideat(){ System.out.println(“Eating.”); } publicvoidmove(){ System.out.println(“Moving.”);}}publicclassZoo{ publicstaticvoidmain(Stringargs[]){ Animalxb=newAnimal(); xb.legs=4; System.out.println(xb.legs); xb.eat();xb.move();}}問(wèn)題:xb.legs=-1000;應(yīng)該將legs屬性保護(hù)起來(lái),防止亂用。保護(hù)的方式:信息隱藏Java中通過(guò)將數(shù)據(jù)聲明為私有的(private),再提供公共的(public)方法:getXxx()和setXxx()實(shí)現(xiàn)對(duì)該屬性的操作,以實(shí)現(xiàn)下述目的:隱藏一個(gè)類中不需要對(duì)外提供的實(shí)現(xiàn)細(xì)節(jié);使用者只能通過(guò)事先定制好的方法來(lái)訪問(wèn)數(shù)據(jù),可以方便地加入控制邏輯,限制對(duì)屬性的不合理操作;便于修改,增強(qiáng)代碼的可維護(hù)性;信息的封裝和隱藏

信息的封裝和隱藏

publicclassAnimal{

privateintlegs;//將屬性legs定義為private,只能被Animal類內(nèi)部訪問(wèn)

publicvoidsetLegs(inti){//在這里定義方法eat()和move()

if(i!=0||i!=2||i!=4){ System.out.println("Wrongnumberoflegs!"); return; } legs=i; } publicintgetLegs(){ returnlegs; }}publicclassZoo{ publicstaticvoidmain(Stringargs[]){ Animalxb=newAnimal(); //xb.setLegs(4); xb.setLegs(-1000); //xb.legs=-1000;

//非法

System.out.println(xb.getLegs());}}Java權(quán)限修飾符public、protected、private置于類的成員定義前,用來(lái)限定對(duì)象對(duì)該類成員的訪問(wèn)權(quán)限。四種訪問(wèn)權(quán)限修飾符修飾符類內(nèi)部同一個(gè)包子類任何地方privateYes(缺省)YesYesprotectedYesYesYespublicYesYesYesYes對(duì)于class的權(quán)限修飾只可以用public和default(缺省)。public類可以在任意地方被訪問(wèn)。default類只可以被同一個(gè)包內(nèi)部的類訪問(wèn)。privatedefaultprotectedpublic相應(yīng)的調(diào)用者練習(xí)41.創(chuàng)建程序,在其中定義兩個(gè)類:Person和TestPerson類。定義如下:

用setAge()設(shè)置人的合法年齡(0~130),用getAge()返回人的年齡。在TestPerson類中實(shí)例化Person類的對(duì)象b,調(diào)用setAge()和getAge()方法,體會(huì)Java的封裝性。Person-age:int+setAge(i:int)+getAge():int3.8類的成員之三:構(gòu)造器(構(gòu)造方法)構(gòu)造器的特征它具有與類相同的名稱它不聲明返回值類型。(與聲明為void不同)不能被static、final、synchronized、abstract、native修飾,不能有return語(yǔ)句返回值構(gòu)造器的作用:創(chuàng)建對(duì)象;給對(duì)象進(jìn)行初始化如:Ordero=newOrder();Personp=newPerson(Peter,15);如同我們規(guī)定每個(gè)“人”一出生就必須先洗澡,我們就可以在“人”的構(gòu)造方法中加入完成“洗澡”的程序代碼,于是每個(gè)“人”一出生就會(huì)自動(dòng)完成“洗澡”,程序就不必再在每個(gè)人剛出生時(shí)一個(gè)一個(gè)地告訴他們要“洗澡”了。構(gòu)造器語(yǔ)法格式:修飾符

類名

(參數(shù)列表){

初始化語(yǔ)句;}舉例:publicclassAnimal{privateintlegs;publicAnimal(){legs=4;} //構(gòu)造器publicvoidsetLegs(inti){legs=i;}publicintgetLegs(){returnlegs;}}創(chuàng)建Animal類的實(shí)例:Animala=newAnimal();//調(diào)用構(gòu)造器,將legs初始化為4。構(gòu)造器根據(jù)參數(shù)不同,構(gòu)造器可以分為如下兩類:隱式無(wú)參構(gòu)造器(系統(tǒng)默認(rèn)提供)顯式定義一個(gè)或多個(gè)構(gòu)造器(無(wú)參、有參)注意:Java語(yǔ)言中,每個(gè)類都至少有一個(gè)構(gòu)造器默認(rèn)構(gòu)造器的修飾符與所屬類的修飾符一致一旦顯式定義了構(gòu)造器,則系統(tǒng)不再提供默認(rèn)構(gòu)造器一個(gè)類可以創(chuàng)建多個(gè)重載的構(gòu)造器父類的構(gòu)造器不可被子類繼承練習(xí)51.在前面定義的Person類中添加構(gòu)造器,利用構(gòu)造器設(shè)置所有人的age屬性初始值都為18。2.修改上題中類和構(gòu)造器,增加name屬性,使得每次創(chuàng)建Person對(duì)象的同時(shí)初始化對(duì)象的age屬性值和name屬性值。Person-name:String+setName(i:String)+getName():String練習(xí)53.定義一個(gè)“點(diǎn)”(Point)類用來(lái)表示三維空間中的點(diǎn)(有三個(gè)坐標(biāo))。要求如下:1)可以生成具有特定坐標(biāo)的點(diǎn)對(duì)象。2)提供可以設(shè)置三個(gè)坐標(biāo)的方法。3)提供可以計(jì)算該“點(diǎn)”距原點(diǎn)距離平方的方法。4)編寫兩個(gè)類,TriAngle和TestTriAngle,其中TriAngle中聲明私有的底邊長(zhǎng)base和高h(yuǎn)eight,同時(shí)聲明公共方法訪問(wèn)私有變量;另一個(gè)類中使用這些公共方法,計(jì)算三角形的面積。構(gòu)造器重載構(gòu)造器一般用來(lái)創(chuàng)建對(duì)象的同時(shí)初始化對(duì)象。如classPerson{ Stringname; intage; publicPerson(Stringn,inta){name=n;age=a;}}構(gòu)造器重載使得對(duì)象的創(chuàng)建更加靈活,方便創(chuàng)建各種不同的對(duì)象。構(gòu)造器重載舉例:publicclassPerson{publicPerson(Stringname,intage,Dated){this(name,age);…}publicPerson(Stringname,intage){…}publicPerson(Stringname,Dated){…}publicPerson(){…}}構(gòu)造器重載,參數(shù)列表必須不同構(gòu)造器重載舉例publicclassPerson{privateStringname;privateintage;privateDatebirthDate;publicPerson(Stringname,intage,Dated){ =name; this.age=age; this.birthDate=d;}publicPerson(Stringname,intage){ this(name,age,null); //=name;this.age=age;

this.birthDate=null;}publicPerson(Stringname,Dated){ this(name,30,d); //=name;this.age=30;this.birthDate=d;}publicPerson(Stringname){ this(name,30); //=name;this.age=30;}}練習(xí)6(1)定義Person類,有4個(gè)屬性:Stringname;intage;Stringschool;Stringmajor(2)定義Person類的3個(gè)構(gòu)造方法:第一個(gè)構(gòu)造方法Person(Stringn,inta)設(shè)置類的name和age屬性;第二個(gè)構(gòu)造方法Person(Stringn,inta,Strings)設(shè)置類的name,age和school屬性;第三個(gè)構(gòu)造方法Person(Stringn,inta,Strings,Stringm)設(shè)置類的name,age,school和major屬性;(3)在main方法中分別調(diào)用不同的構(gòu)造方法創(chuàng)建的對(duì)象,并輸出其屬性值。在java中,this關(guān)鍵字比較難理解,它的作用和其詞義很接近。它在方法內(nèi)部使用,即這個(gè)方法所屬對(duì)象的引用;它在構(gòu)造器內(nèi)部使用,表示該構(gòu)造器正在初始化的對(duì)象。this表示當(dāng)前對(duì)象,可以調(diào)用類的屬性、方法和構(gòu)

造器什么時(shí)候使用this關(guān)鍵字呢?當(dāng)在方法內(nèi)需要用到調(diào)用該方法的對(duì)象時(shí),就用this。3.9關(guān)鍵字—thisthis是什么?使用this,調(diào)用屬性、方法classPerson{ //定義Person類

privateStringname;

privateintage;

publicPerson(Stringname,intage){

=name;

this.age=age;} publicvoidgetInfo(){

System.out.println("姓名:"+name); this.speak(); } publicvoidspeak(){ System.out.println(“年齡:”+this.age); }}1.當(dāng)形參與成員變量重名時(shí),如果在方法內(nèi)部需要使用成員變量,必須添加this來(lái)表明該變量時(shí)類成員2.在任意方法內(nèi),如果使用當(dāng)前類的成員變量或成員方法可以在其前面添加this,增強(qiáng)程序的閱讀性classPerson{

//定義Person類

privateStringname;

privateintage;

publicPerson(){

//無(wú)參構(gòu)造

System.out.println("新對(duì)象實(shí)例化"); } publicPerson(Stringname){ this();//調(diào)用本類中的無(wú)參構(gòu)造方法

=name; } publicPerson(Stringname,intage){

this(name);

//調(diào)用有一個(gè)參數(shù)的構(gòu)造方法

this.age=age;

} publicStringgetInfo(){ return"姓名:"+name+",年齡:"+age; }}使用this調(diào)用本類的構(gòu)造器3.this可以作為一個(gè)類中,構(gòu)造器相互調(diào)用的特殊格式注意:1.使用this()必須放在構(gòu)造器的首行!2.使用this調(diào)用本類中其他的構(gòu)造器,保證至少有一個(gè)構(gòu)造器是不用this的。classPerson{//定義Person類 Stringname; Person(Stringname){ =name;} publicvoidgetInfo(){ System.out.println("Person類-->"+);} publicbooleancompare(Personp){ ==; }}publicclassTestPerson{ publicstaticvoidmain(Stringargs[]){ Personper1=newPerson("張三"); Personper2=newPerson("李四"); per1.getInfo(); //當(dāng)前調(diào)用getInfo()方法的對(duì)象是per1 per2.getInfo(); //當(dāng)前調(diào)用getInfo()方法的對(duì)象是per2 booleanb=pare(per2); }}當(dāng)前正在操作本方法的對(duì)象稱為當(dāng)前對(duì)象。Boy-name:String-age:int+setName(i:String)+getName():String+setAge(i:int)+getAge():int+marry(girl:Girl)+shout():voidGirl-name:String+setName(i:String)+getName():String+marry(boy:Boy)練習(xí)7添加必要的構(gòu)造器,綜合應(yīng)用構(gòu)造器的重載,this關(guān)鍵字。JavaBeanJavaBean是一種Java語(yǔ)言寫成的可重用組件。所謂javaBean,是指符合如下標(biāo)準(zhǔn)的Java類:類是公共的有一個(gè)無(wú)參的公共的構(gòu)造器有屬性,且有對(duì)應(yīng)的get、set方法用戶可以使用JavaBean將功能、處理、值、數(shù)據(jù)庫(kù)訪問(wèn)和其他任何可以用java代碼創(chuàng)造的對(duì)象進(jìn)行打包,并且其他的開(kāi)發(fā)者可以通過(guò)內(nèi)部的JSP頁(yè)面、Servlet、其他JavaBean、applet程序或者應(yīng)用來(lái)使用這些對(duì)象。用戶可以認(rèn)為JavaBean提供了一種隨時(shí)隨地的復(fù)制和粘貼的功能,而不用關(guān)心任何改變。JavaBean示例publicclassTestJavaBean{

privateStringname;//屬性一般定義為private

privateintage;publicTestJavaBean(){}publicintgetAge(){returnage;}publicvoidsetAge(intage){this.age=age;}publicStringgetName(){returnname;}publicvoidsetName(Stringname){=name;}類名屬性:“:”前是屬性名,“:”后是屬性的類型方法若方法有下劃線表示為構(gòu)造方

溫馨提示

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