OOP 03 第3章 類與對(duì)象-抽象與封裝的Java實(shí)現(xiàn)_第1頁
OOP 03 第3章 類與對(duì)象-抽象與封裝的Java實(shí)現(xiàn)_第2頁
OOP 03 第3章 類與對(duì)象-抽象與封裝的Java實(shí)現(xiàn)_第3頁
OOP 03 第3章 類與對(duì)象-抽象與封裝的Java實(shí)現(xiàn)_第4頁
OOP 03 第3章 類與對(duì)象-抽象與封裝的Java實(shí)現(xiàn)_第5頁
已閱讀5頁,還剩74頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

第3章類與對(duì)象--抽象與封裝的Java實(shí)現(xiàn)

提綱3.1抽象與封裝的實(shí)現(xiàn)技術(shù)3.2類(屬性成員、方法成員,構(gòu)造方法)3.3對(duì)象3.4訪問屬性控制3.5靜態(tài)成員3.6final、this和null修飾符態(tài)成員3.7對(duì)象拷貝3.8應(yīng)用舉例3.1抽象與封裝的實(shí)現(xiàn)技術(shù)

實(shí)現(xiàn)抽象和封裝——類和對(duì)象一個(gè)對(duì)象是的關(guān)注領(lǐng)域世界中特定實(shí)體在程序中的具體體現(xiàn),它包含了若干個(gè)成員變量和成員方法。成員變量反映實(shí)體的屬性狀態(tài),成員方法反映實(shí)體具有的行為能力,這些成員的規(guī)格描述將由類承擔(dān),類是對(duì)具有類似特征的對(duì)象的抽象說明,對(duì)象是類的實(shí)例。對(duì)象體的構(gòu)成………………繪制直線獲取屬性值設(shè)置屬性值成員方法(對(duì)象/類“線”的描述)示例:線classclassLine{//屬性集PointstartPoint,endPoint;//起點(diǎn)和終點(diǎn)ColorfrontColor;intwidth;//畫線的寬度LineStylelineStyle;//線的類型,虛線、雙線…//方法集voiddraw(Graphicsg);//在圖形設(shè)備g上畫出此線doublelength();//獲得此線的長度voidsetStartPoint(Pointp);PointgetStartPoint();…}3.2類

3.2.1類的定義

Java語言中,類主要有兩個(gè)來源途徑Java類庫

用戶自定義的類Object類是所有的類的超類。如果在自定義類時(shí),沒有寫明父類,則默認(rèn)的父類為Object。從嚴(yán)格意義上講,Java程序中定義的所有類都是子類。最簡(jiǎn)單的類定義格式為

classClassName{ ClassBody//類體}

class為關(guān)鍵字,ClassName為定義的類名稱ClassBody為類體,可包含成員變量、成員方法、內(nèi)部類、內(nèi)部接口、構(gòu)造方法、靜態(tài)初始化器

類的UML表示一個(gè)類的UML圖形表示如圖

一個(gè)Box類的UML表示

BOX類的UML表示Box類的定義

publicclassBox{intlength,width,height;voidsetLong(intlength

Value){length=lengthValue;}voidsetWidth(intwidthValue){width=widthValue;}voidsetHeight(intheightValue){height=heightValue;}voidsetBox(intlengthValue,intwidthValue,intheightValue){length=lengthValue;width=widthValue;height=heightValue;}intgetLength(){returnlength;}intgetWidth(){returnwidth;}intgetHeight(){returnheight;}}類的嵌套定義(避免使用)classOutClass{//頂層類

intconut;classInClass{//內(nèi)部類

voidprintConut(){ System.out.println("conut:"+(++conut));}}voidcreateInObject(){InClassin=newInClass();//引用內(nèi)部類

in.printConut();}}類的嵌套定義(避免使用)publicclassTestInClass//用于測(cè)試內(nèi)部類應(yīng)用的類{publicstaticvoidmain(String[]args){OutClassoutObj=newOutClass();//創(chuàng)建外部類對(duì)象

outObj.createInObject();//調(diào)用創(chuàng)建內(nèi)部類的成員方法

OutClass.InClassinObj=outObj.newInClass();//在外部創(chuàng)建內(nèi)部類對(duì)象

inObj.printConut();}}

運(yùn)行結(jié)果:conut:1conut:2

JAVA類的存儲(chǔ)有兩種存儲(chǔ)方式:多個(gè)類定義存放在一個(gè)文件中,(但每個(gè).java文件中只可有一個(gè)public類,且文件名與pubilc類名同名)

每個(gè)類定義分別存放在不同的文件中不管源代碼如何存放,編譯后每一個(gè)類都將生成一個(gè)字節(jié)碼文件,且文件名的前綴為類名,后綴為.class

含有屬于另外一個(gè)類的成員變量的典型例子

classDate{intyear,month,day;//描述年、月、日的三個(gè)成員變量

voidsetYear(inty){ year=y; }voidsetMonth(intm){ month=m;}voidsetDay(intd){ day=d;}voidsetDate(inty,intm,intd){year=y;month=m;day=d;}intgetYear(){returnyear;}intgetMonth(){returnmonth;}intgetDay(){returnday;}}Book類定義classBook//書籍類{Stringname;Stringauthor;DatepublishDate;floatprice;……//其他一些成員變量

……//成員方法}

Date是描述日期的類,Book是描述書籍的類。在Book類中,設(shè)一個(gè)表示出版日期的成員變量,它屬于Date類。

Book類與Date類關(guān)系可以將這兩個(gè)類看成具有“整體-部分”的關(guān)系。即Book類是由Date類對(duì)象和一些其他類型的成員變量組合而成的,它們共同地反映了書籍信息。下面是這種關(guān)系的UML圖形符號(hào):

publishDate類中的成員在類中定義的成員時(shí),根據(jù)所承擔(dān)的作用分為:變量/數(shù)據(jù)成員方法/操作成員在以上基礎(chǔ)上,變量和方法根據(jù)內(nèi)存分配情況又分為兩類:實(shí)例成員:類創(chuàng)建實(shí)例后,每個(gè)實(shí)例擁有一份,不同實(shí)例之間互不干擾。訪問它們時(shí),必須通過實(shí)例/對(duì)象名訪問類成員:每個(gè)類只有唯一一份,被類的各個(gè)成員共享。訪問它們時(shí),可根據(jù)實(shí)例/對(duì)象名訪問,也可直接通過類名訪問。定義時(shí),加上關(guān)鍵字:static因此,類中成員共分為四類:實(shí)例變量,實(shí)例方法類變量,類方法3.2.2成員變量的定義與初始化

實(shí)例變量的定義格式:ModifiersDataTypeMemberName;Modifiers:修飾符,決定成員變量的存儲(chǔ)方式和訪問權(quán)限D(zhuǎn)ataType:

成員變量的類型MemberName:是成員變量的名稱如:classBook{//書籍類

publicStringname;

protectedStringauthor;

privateDatepublishDate;floatprice;……//其他一些成員變量

……//成員方法}

初始化實(shí)例變量主要有5個(gè)途徑每個(gè)數(shù)據(jù)數(shù)據(jù)類型有默認(rèn)的初始值可以在定義的同時(shí)賦予相應(yīng)的初值在一個(gè)成員方法中,為每個(gè)實(shí)例變量賦值在類的構(gòu)造方法中實(shí)現(xiàn)初始化實(shí)例變量

利用初始化塊對(duì)成員變量進(jìn)行初始化

初始化塊、構(gòu)造方法初始化成員變量

classPoint{intx,y;

{//初始化塊,無名代碼塊

x=10;y=20;System.out.println("Pointinitializationblock");}Point(){};//無參數(shù)的構(gòu)造方法

Point(intdx,intdy)//帶兩個(gè)參數(shù)的構(gòu)造方法

{x=dx;y=dy;//System.out.println("Pointconstructmethod");}}

3.2.3成員方法的定義

成員方法主要承擔(dān)外部操作對(duì)象屬性的任務(wù),如:Setters方法:對(duì)類中的每個(gè)成員變量賦值,Getters方法:獲取每個(gè)成員變量的當(dāng)前值,實(shí)現(xiàn)類/對(duì)象的其它功能的成員方法,如一般類的toString(),矩形類的area()方法。實(shí)例方法

定義格式為:

ModifiersResultTypeMethodName(parameterList)[throwsexceptions]{MethodBody}Modifiers:修飾符

(public/protected/private)ResultType:方法返回類型(void/String/int/…)MethodName:方法名稱parameterList:參數(shù)列表

throwsexceptions:列出方法能夠拋出的異常種類

時(shí)間類Time的定義publicclassTime//時(shí)間類{inthour,minute,second;//時(shí)、分、秒

voidsetTime(inth,intm,ints)//設(shè)置時(shí)間

{hour=(h<0)?0:h%24;minute=(m<0)?0:m%60;second=(s<0)?0:s%60;}intgetHour(){returnhour;}//返回時(shí)

intgetMinute(){returnminute;}//返回分

intgetSecond(){returnsecond;}//返回秒}

成員方法中處理的數(shù)據(jù)主要來源途徑

傳遞給成員方法的參數(shù)類中的成員變量,包括實(shí)例變量和類變量在方法體內(nèi)定義的局部變量在方法中調(diào)用其他成員方法所得到的返回值3.2.4成員方法的重載

重載——

在一個(gè)類中,同一個(gè)名稱的成員方法可以被定義多次的現(xiàn)象。一個(gè)成員方法重載的例子

在Time類,我們又增加了一個(gè)設(shè)置時(shí)間的成員方法,但這個(gè)成員方法的參數(shù)屬于String類,時(shí)間將以“12:04:35”的格式傳遞給該成員方法。classTime{inthour,minute,second;voidsetTime(inth,intm,ints)//參數(shù)為三個(gè)int變量

{hour=(h<0)?0:h%24;minute=(m<0)?0:m%60;second=(s<0)?0:s%60;}//參數(shù)為一個(gè)String類對(duì)象,如14:25:35voidsetTime(Stringtime)

{hour=Integer.parseInt(time.substring(0,2));hour=hour<0?0:hour%24;minute=Integer.parseInt(time.substring(3,5));minute=minute<0?0:minute%60;second=Integer.parseInt(time.substring(6,8));second=second<0?0:second%60;}intgetHour(){returnhour;}intgetMinute(){returnminute;}intgetSecond(){returnsecond;}}//endofclassTimepublicclassTestTime//測(cè)試類{ publicstaticvoidmain(Stringargs[]) { Timet=newTime();//創(chuàng)建Time對(duì)象

t.setTime("13:04:20");//調(diào)用參數(shù)為String的setTime()方法

System.out.println(t.getHour()+":"+t.getMinute()+":"+t.getSecond()); t.setTime(20,30,38);//調(diào)用參數(shù)為三個(gè)int的setTime()方法

System.out.println(t.getHour()+":"+t.getMinute()+":"+t.getSecond()) }}

將上面這兩個(gè)類定義存儲(chǔ)在一個(gè)文件名為TestTime.java中。經(jīng)過編譯生成Time.class和TestTime.class

運(yùn)行的結(jié)果為:

13:4:2020:30:383.2.5構(gòu)造方法構(gòu)造方法——

在構(gòu)造類對(duì)象時(shí)使用的一種特殊的成員方法,其主要作用是初始化成員變量。

構(gòu)造方法的定義格式為:

[public]ClassName(parameterList)public:控制訪問權(quán)限的修飾符ClassName:類名稱parameterList:參數(shù)表

簡(jiǎn)單的例子classPoint{intx,y,;Point(intdx,intdy){x=dx;y=dy;}……//其他的成員方法}

構(gòu)造方法Point(intdx,intdy)僅對(duì)兩個(gè)成員變量x和y賦予了初值。在利用new運(yùn)算符創(chuàng)建Point類對(duì)象時(shí),系統(tǒng)會(huì)自動(dòng)地調(diào)用這個(gè)構(gòu)造方法,實(shí)現(xiàn)對(duì)實(shí)例變量初始化,而不需要用戶顯式地調(diào)用它。構(gòu)造方法的重載publicclassTime{inthour,minute,second;//用時(shí)、分、秒三個(gè)屬性描述時(shí)間

Time(inth,int,m,ints){……}//含有三個(gè)int類型參數(shù)的構(gòu)造方法

Time(longtime){……}//含有一個(gè)long類型參數(shù)的構(gòu)造方法

Time(Stringtime){……}//含有一個(gè)String類參數(shù)的構(gòu)造方法

voidsetTime(inth,intm,ints){……}intgetHour(){……}intgetMinute(){……}intgetSecond(){……}}

在這個(gè)類中,有三個(gè)構(gòu)造方法,它們的參數(shù)表均不相同。這樣,就可以用三種不同形式的參數(shù)創(chuàng)建并初始化對(duì)象。

默認(rèn)構(gòu)造方法

如果在定義類的時(shí)候,沒有定義任何構(gòu)造方法,系統(tǒng)將提供一個(gè)參數(shù)表為空的默認(rèn)構(gòu)造方法。在這個(gè)默認(rèn)的構(gòu)造方法的方法體中,只有一個(gè)調(diào)用父類無參數(shù)構(gòu)造方法的語句super()。例如:publicclassPoint{intx,y;……;//其他的成員方法}等價(jià)于publicclassPoint{intx,y;publicPoint(){super();}……;//其他的成員方法}3.3對(duì)象

類(對(duì)象)是對(duì)現(xiàn)實(shí)世界中實(shí)體進(jìn)行抽象的結(jié)果,現(xiàn)實(shí)世界中的任何實(shí)體都可以映射成對(duì)象。解決問題的過程就是對(duì)對(duì)象分析、處理的過程。程序是由有限個(gè)類(對(duì)象)構(gòu)成的,對(duì)象是程序操作的基本單位。所謂程序運(yùn)行,就是對(duì)象之間不斷地發(fā)送消息及響應(yīng)消息的過程。

3.3.1對(duì)象的創(chuàng)建兩步:聲明對(duì)象變量,創(chuàng)建對(duì)象實(shí)例。聲明對(duì)象的語法格式為:

ClassNameobjectName[,objectName];例如:

DatedateObject;TimetimeObject1,timeObject2;new運(yùn)算符創(chuàng)建對(duì)象的格式為:

newClassName(parameterList)

ClassName:對(duì)象所屬的類名稱parameterList:創(chuàng)建對(duì)象時(shí)提供的參數(shù)new運(yùn)算符主要完成的操作:為對(duì)象分配存儲(chǔ)空間根據(jù)提供的參數(shù)格式調(diào)用與之匹配的構(gòu)造方法例如:dateObject=newDate(2003,5,23,10,34,56)3.3.2對(duì)象成員的使用對(duì)象創(chuàng)建后,就可以在對(duì)象之間相互發(fā)送及響應(yīng)消息,以便驅(qū)動(dòng)程序的運(yùn)作。發(fā)送消息就是對(duì)象發(fā)出調(diào)用自身或其他類對(duì)象的成員方法的命令,響應(yīng)消息就是對(duì)象具體地執(zhí)行上述的調(diào)用命令。

在對(duì)對(duì)象操作時(shí),可能會(huì)引用成員變量或調(diào)用成員方法。下面是引用成員變量和調(diào)用成員方法的語法格式。objectName.memberVariableNameobjectName.memberMethodName(parameterList)

調(diào)用對(duì)象成員方法實(shí)際上就是向該對(duì)象發(fā)送請(qǐng)求操作的消息例3.3.1對(duì)象作為數(shù)組元素

classScoreClass//成績(jī)類{intNo;//學(xué)號(hào)

intscore;//成績(jī)

ScoreClass()//無參數(shù)的構(gòu)造方法

{No=1000;score=0;}ScoreClass(intn,ints)//有兩個(gè)參數(shù)的構(gòu)造方法

{No=n;score=s;}

voidsetInfo(intn,ints)//設(shè)置成績(jī)

{No=n;score=s;}intgetNo(){returnNo;}//獲取學(xué)號(hào)

intgetScore(){returnScore;}//獲取成績(jī)}

publicclassScoreTest//測(cè)試類{ publicstaticvoidmain(String[]args){ ScoreClass[]student=newScoreClass[10];//聲明并創(chuàng)建一維數(shù)組

for(inti=0;i<10;i++){ student[i]=newScoreClass( 1000+i,(int)(Math.random()*100) );//創(chuàng)建對(duì)象

} for(inti=0;i<10;i++){ System.out.println(student[i].getNo()+"\t"+student[i].getScore()); } }}

應(yīng)用對(duì)象數(shù)組元素,需要經(jīng)過下面幾個(gè)操作步驟:聲明對(duì)象數(shù)組 用new創(chuàng)建數(shù)組。此時(shí),每個(gè)數(shù)組元素為null引用。 再用循環(huán)結(jié)構(gòu),為每個(gè)數(shù)組元素創(chuàng)建對(duì)象。 通過引用成員變量或調(diào)用成員方法對(duì)數(shù)組中每個(gè)對(duì)象進(jìn)行操作。例3.3.2類中的成員變量為對(duì)象

classPoint{//點(diǎn)坐標(biāo)

intx,y;//x、y坐標(biāo)

Point(){x=0;y=0;} Point(intdx,intdy){x=dx;y=dy;} voidsetXY(intdx,intdy){x=dx;y=dy;}//設(shè)置x、y intgetX(){returnx;}//返回x intgetY(){returny;}//返回y publicStringtoString(){//將坐標(biāo)信息轉(zhuǎn)換成String形式

return"("+x+","+y+")";}}

classRect{//矩形類 PointleftTop,rightBottom;//矩形左上角坐標(biāo),右下角坐標(biāo)

Rect(){ leftTop=newPoint(); rightBottom=newPoint(); }Rect(intx1,inty1,intx2,inty2){ leftTop=newPoint(x1,y1); rightBottom=newPoint(x2,y2); }

Rect(Pointlefttop,Pointrightbottom){ this.leftTop=lefttop; this.rightBottom=rightbottom;}doublegetArea(){returnMath.abs((leftTop.getX-rightbottom.getX)*(leftTop.getY-rightbottom.getY));}doublegetPerimeter

(){returnMath.abs((leftTop.getX-rightbottom.getX)+(leftTop.getY-rightbottom.getY))*2;}PointgetLeftTop(){returnleftTop;}//返回左上角坐標(biāo)PointgetRightBottom(){returnrightBottom;}//返回右下角坐標(biāo)publicStringtoString(){//將矩形信息轉(zhuǎn)換成String形式

returnleftTop.toString()+rightBottom.toString();}}

//endofclassRectpublicclassRectTest{//測(cè)試類

publicstaticvoidmain(String[]args){

Rectr1,r2,r3; Pointp1,p2; r1=newRect(10,20,30,40); p1=newPoint(); p2=newPoint(100,100); r2=newRect(p1,p2); System.out.println("r1:"+r1); System.out.println(“r1周長:”+r1.getPerimeter()+“,r1面積:"+r1.getArea()); System.out.println("r2is:"+r2.toString()); System.out.println(“r2周長:”+r2.getPerimeter()+“,r2面積:"+r2.getArea()); }}運(yùn)行這個(gè)程序后,應(yīng)該得到結(jié)果:r1:(10,20)(30,40)r1周長:80.0,r1面積:400.0r2:(0,0)(100,100)r2周長:400.0,r1面積:10000.0通過這個(gè)例子,可以看出,對(duì)于含有成員對(duì)象的類,首先要?jiǎng)?chuàng)建每個(gè)成員對(duì)象,然后才能對(duì)其進(jìn)行操作。建議最好將它們放置在構(gòu)造方法中實(shí)現(xiàn)。3.3.3對(duì)象的清除創(chuàng)建對(duì)象的主要任務(wù)是為對(duì)象分配存儲(chǔ)空間,而清除對(duì)象的主要任務(wù)是回收存儲(chǔ)空間。Java語言提供了“自動(dòng)回收垃圾”的機(jī)制。系統(tǒng)會(huì)周期地監(jiān)控對(duì)象是否還被使用,將不再被使用的對(duì)象自動(dòng)地回收其所占用存儲(chǔ)空間。

3.4訪問屬性控制類、接口,它們的成員變量、成員方法都存在是否可以被他人訪問的訪問屬性。訪問屬性標(biāo)識(shí)可訪問性??稍L問性是在編譯時(shí)確定的靜態(tài)特性。訪問屬性機(jī)制實(shí)現(xiàn)數(shù)據(jù)隱藏,限制用戶對(duì)不同包和類的訪問權(quán)限。

4種訪問屬性

默認(rèn)訪問屬性public(公有)訪問屬性private(私有)訪問屬性protected(保護(hù))訪問屬性

為類、接口、成員變量和成員方法指定訪問屬性的格式為:[public|private|protected]ClassName;[public|private|protected]memberVariableName;[public|private|protected]memberMethodName(parameterList);

由于除默認(rèn)訪問屬性外,指定其他三種訪問屬性需要寫在定義之前,所以,又將它們稱為修飾符。3.4.1默認(rèn)訪問屬性如果沒有指定訪問修飾符,它們的訪問屬性就為默認(rèn)訪問屬性。具有默認(rèn)訪問屬性的類、成員變量和成員方法,只能被本類和同一個(gè)包中的其他類、接口及成員方法引用。

3.4.2public訪問屬性擁有public訪問屬性的類、接口、成員變量、成員方法可以被本類和其他任何類及成員方法引用。它們既可以位于同一個(gè)包中,也可以位于不同包中。例3.4.1不同包之間的類訪問

下面定義的三個(gè)類Point、Line和Test分別放在兩個(gè)不同的包中。其定義如下:packagePointPackage;//將Point和Line類放入PointPackage包publicclassPoint{publicintx,y;publicvoidmove(intdx,intdy){x+=dx;y+=dy;}//其他的成員方法

……;}classLine{Pointstart,end;Line(){start=newPoint();end=newPoint();}publicsetLine(Pointp1,Pointp2){......}//其他的成員方法

……;}將Point和Line類定義保存為Point.java文件。packagePointsUser;//將Test類放入PointsUser包importPointPackage.*;//加載PointPackage包中的Point和Line類publicclassTest{publicstaticvoidmain(String[]args){Pointp1=newPoint();Pointp2=newPoint(20,30);System.out.println(p.x+""+p.y);Lineline1=newLine(p1,p2);//!!!語法錯(cuò)誤,找不到類Line}}將這個(gè)類定義保存為Test.java文件。3.4.3private訪問屬性數(shù)據(jù)隱藏是面向?qū)ο蟮某绦蛟O(shè)計(jì)倡導(dǎo)的設(shè)計(jì)思想。將數(shù)據(jù)與其操作封裝在一起,并將數(shù)據(jù)的組織隱藏起來利用成員方法作為對(duì)外的操作接口,這樣不但可以提高程序的安全性、可靠性,還有益于日后的維護(hù)、擴(kuò)展和重用。將類定義中的數(shù)據(jù)成員設(shè)置為private訪問屬性是實(shí)現(xiàn)數(shù)據(jù)隱藏機(jī)制的最佳方式。private訪問(私有)屬性可以應(yīng)用于類中的成員,包括成員變量、成員方法和內(nèi)部類或內(nèi)部接口。私有成員只能被本類中的方法直接引用。3.4.4protected訪問屬性

具有protected訪問屬性的類成員可以被本類、本包和其他包中的子類訪問。它的可訪問性介于默認(rèn)和public之間。如果你希望只對(duì)本包之外的子類開放,就應(yīng)該將其指定為protected訪問屬性。

歸納上述4種不同的訪問屬性,可以將各種訪問屬性的可訪問權(quán)限總結(jié)在表中:同一個(gè)類同一個(gè)包不同包中的子類不同包中的非子類private*默認(rèn)**protected***public****3.5靜態(tài)成員3.5.1類變量的定義及初始化在類中定義成員變量時(shí),如果在訪問屬性修飾符之后,加上static修飾符,它們就屬于靜態(tài)成員。例如:publicstaticintstaticMember;

靜態(tài)成員變量只在加載類時(shí)創(chuàng)建一個(gè)副本,不管未來創(chuàng)建多少個(gè)這個(gè)類的對(duì)象,都將共享這一個(gè)副本。類變量的引用類變量在類被加載后立即創(chuàng)建,所以即使在該類沒有創(chuàng)建一個(gè)對(duì)象的時(shí)候,類變量也已經(jīng)存在。兩種引用方式:未創(chuàng)建對(duì)象時(shí),用類名作為前綴引用類變量如果存在該類的對(duì)象,則既可以通過類名引用類變量,也可以通過對(duì)象名引用類變量。類變量不能在構(gòu)造方法中初始化。構(gòu)造方法只有在創(chuàng)建對(duì)象時(shí)才被調(diào)用,而類變量在沒有創(chuàng)建對(duì)象之前就已經(jīng)存在,并可以被引用;每創(chuàng)建一個(gè)對(duì)象,構(gòu)造方法就要被調(diào)用一次,而類變量應(yīng)該只被初始化一次。

類變量舉例publicclassPerson{publicstaticfinalintFEMALE=0;publicstaticfinalintMALE=1;publicstaticintMIN_AGE=0;publicstaticintMAX_AGE=200;Stringname;intage;intsex;…Person(Stringnm,intsx,intag){name=nm;sex=sx;age=ag;}}publicclassTestPerson1{publicstaticvoidmain(String[]args){Personp1=newPerson(“劉翔”,Person.MALE,25);Personp2=newPerson(“吳儀”,Person.FEMALE,55);

Person.MIN_AGE=20;Person.MAX_AGE=200;p1.MAX_AGE=150;System.out.println(p1.MIN_AGE);//1??System.out.println(p2.MAX_AGE);//2??System.out.println(Person.MIN_AGE);//3??System.out.println(Person.MAX_AGE);//4??}//endofmain()}//~類變量舉例(續(xù))publicclassTestPerson{publicstaticvoidmain(String[]args){Person[]ps=newPerson[2];ps[0]=newPerson(“劉翔”,Person.MALE,25);ps[1]=newPerson(“吳儀”,Person.FEMALE,55);for(inti=0;i<ps.length;i++){Stringsc=(ps[i].sex==ps[i].MALE)?“男”:“女”;//用中文的性別

System.out.println(“\n姓名:”+ps[i].name+”\n性別:”+sc+”\n年齡:”+ps[i].age);}//endoffor}//endofmain()}//~類變量的初始化器

又稱為靜態(tài)變量初始化器來實(shí)現(xiàn)初始化。類變量初始化器應(yīng)該位于類定義中,其語法格式為:

static{......//類變量初始化}

構(gòu)造方法與類變量初始化器(1)構(gòu)造方法用來初始化對(duì)象的實(shí)例變量類變量初始化器用來初始化類變量;(2)構(gòu)造方法在創(chuàng)建對(duì)象,即執(zhí)行new運(yùn)算時(shí)由系統(tǒng)自動(dòng)地調(diào)用類變量初始化器是在加載類時(shí)被自動(dòng)地執(zhí)行;(3)構(gòu)造方法是一種特殊的成員方法,類變量初始化器不是方法。3.5.2類方法類方法也屬于類。在類方法中,只能對(duì)該方法中的局部變量或類變量進(jìn)行操作,而不能引用實(shí)例變量或調(diào)用實(shí)例方法。如果希望將一個(gè)成員方法定義成類方法,就在訪問屬性修飾符之后,加上static修飾符即可。例如:

publicstaticintgetMember(){returnstaticMember;}

3.6final、this和null修飾符finalfinal修飾某個(gè)方法:意味著這個(gè)方法不能被覆蓋final修飾成員變量:意味著這個(gè)成員變量在第一次被賦值后,不得被二次賦值final修飾局部變量:在第一次被賦值后,也只能被引用,不能被二次賦值。final修飾某個(gè)類:意味著這個(gè)類不能再作為父類派生其他的子類thisthis是對(duì)象自身的引用型系統(tǒng)變量。當(dāng)在實(shí)例方法中引用本類的實(shí)例成員時(shí),編譯器會(huì)默認(rèn)地在實(shí)例成員前加上this作為前綴。例如構(gòu)造方法Employee(Stringn,doubles)這樣編寫publicEmployee(Stringn,doubles){name=n;salary=s;id=nextId;}this

但實(shí)際上,編譯器會(huì)將它改為:publicEmployee(Stringn,doubles){=n;this.salary=s;this.id=nextId;}通常情況下,對(duì)實(shí)例成員的引用,編譯器都會(huì)自動(dòng)地幫助你加上this前綴。

若類的構(gòu)造方法中的參數(shù)與類的實(shí)例變量命名為相同的名稱,在成員方法中引用的變量名為局部變量,若想引用實(shí)例變量就需要顯式地加上this。nullnull是一個(gè)直接量,表示引用型變量為空的狀態(tài),通常用來作為引用型變量的初始值。例如:Employeee=null

當(dāng)希望一個(gè)對(duì)象型變量放棄它引用的對(duì)象時(shí),也可以使用null實(shí)現(xiàn)。例如:

Employeee=newEmployee(“Wang”,2000.0);

若讓e放棄它引用的對(duì)象,可以寫成

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(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)論