Java程序設(shè)計(jì)(鄭莉)-第2講_第1頁(yè)
Java程序設(shè)計(jì)(鄭莉)-第2講_第2頁(yè)
Java程序設(shè)計(jì)(鄭莉)-第2講_第3頁(yè)
Java程序設(shè)計(jì)(鄭莉)-第2講_第4頁(yè)
Java程序設(shè)計(jì)(鄭莉)-第2講_第5頁(yè)
已閱讀5頁(yè),還剩109頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1第

2講

類(lèi)與對(duì)象清華大學(xué)鄭莉目錄面向?qū)ο蠓椒ǖ奶匦灶?lèi)與對(duì)象根底對(duì)象初始化和回收枚舉類(lèi)型應(yīng)用舉例2面向?qū)ο蠓椒ǖ奶匦?lt;2.1>抽象、封裝、繼承、多態(tài)3抽象忽略問(wèn)題中與當(dāng)前目標(biāo)無(wú)關(guān)的方面只關(guān)注與當(dāng)前目標(biāo)有關(guān)的方面4例:鐘表數(shù)據(jù)(屬性)intHour;intMinute;intSecond;方法(行為)SetTime();ShowTime();5封裝封裝是一種信息隱蔽技術(shù)利用抽象數(shù)據(jù)類(lèi)型將數(shù)據(jù)和基于數(shù)據(jù)的操作封裝在一起;用戶(hù)只能看到對(duì)象的封裝界面信息,對(duì)象的內(nèi)部細(xì)節(jié)對(duì)用戶(hù)是隱蔽的;封裝的目的在于將對(duì)象的使用者和設(shè)計(jì)者分開(kāi),使用者不必知道行為實(shí)現(xiàn)的細(xì)節(jié)。6繼承基于已有類(lèi)產(chǎn)生新類(lèi)的機(jī)制是指新的類(lèi)可以獲得已有類(lèi)〔稱(chēng)為超類(lèi)、基類(lèi)或父類(lèi)〕的屬性和行為,稱(chēng)新類(lèi)為已有類(lèi)的子類(lèi)〔也稱(chēng)為派生類(lèi)〕;在繼承過(guò)程中子類(lèi)繼承了超類(lèi)的特性,包括方法和實(shí)例變量;子類(lèi)也可修改繼承的方法或增加新的方法;有助于解決軟件的可重用性問(wèn)題,使程序結(jié)構(gòu)清晰,降低了編碼和維護(hù)的工作量。7單繼承一個(gè)子類(lèi)只有單一的直接超類(lèi)。多繼承一個(gè)子類(lèi)可以有一個(gè)以上的直接超類(lèi)。Java語(yǔ)言?xún)H支持單繼承。8多態(tài)超類(lèi)及其不同子類(lèi)的對(duì)象可以響應(yīng)同名的消息,具體的實(shí)現(xiàn)方法卻不同;主要通過(guò)子類(lèi)對(duì)父類(lèi)方法的覆蓋來(lái)實(shí)現(xiàn)。9類(lèi)聲明與對(duì)象創(chuàng)立<2.2>類(lèi)與對(duì)象根底<2.2.1>10類(lèi)與對(duì)象的關(guān)系類(lèi)是對(duì)一類(lèi)對(duì)象的描述;對(duì)象是類(lèi)的具體實(shí)例。11類(lèi)聲明 [public][abstract|final]class類(lèi)名稱(chēng) [extends父類(lèi)名稱(chēng)][implements接口名稱(chēng)列表] {

數(shù)據(jù)成員聲明及初始化; 方法聲明及方法體; }12class說(shuō)明其后聲明的是一個(gè)類(lèi)。extends如果所聲明的類(lèi)是從某一父類(lèi)派生而來(lái),那么,父類(lèi)的名字應(yīng)寫(xiě)在extends之后implements如果所聲明的類(lèi)要實(shí)現(xiàn)某些接口,那么,接口的名字應(yīng)寫(xiě)在implements之后public說(shuō)明此類(lèi)為公有類(lèi)abstract指明此類(lèi)為抽象類(lèi)final指明此類(lèi)為終結(jié)類(lèi)13例:鐘表類(lèi)publicclassClock{//變量成員

inthour;intminute;intsecond;//方法成員

publicvoidsetTime(intnewH,intnewM,intnewS){hour=newH;minute=newM;second=news;}publicvoidshowTime(){System.out.println(hour+":"+minute+":"+second);}}對(duì)象聲明與創(chuàng)立創(chuàng)立類(lèi)的實(shí)例〔對(duì)象〕,通過(guò)對(duì)象使用類(lèi)的功能。15<人像>對(duì)象引用聲明語(yǔ)法類(lèi)名引用變量名;例Clock是已經(jīng)聲明的類(lèi)名,聲明引用變量aclock,用于存儲(chǔ)該類(lèi)對(duì)象的引用:Clockaclock;聲明一個(gè)引用變量時(shí)并沒(méi)有生成對(duì)象。16對(duì)象的創(chuàng)立語(yǔ)法形式:

new<類(lèi)名>()例如:aclock=newClock()

new的作用是:在內(nèi)存中為Clock類(lèi)型的對(duì)象分配內(nèi)存空間;返回對(duì)象的引用。引用變量可以被賦以空值例如:aclock=null;17數(shù)據(jù)成員<2.2.2>18數(shù)據(jù)成員表示對(duì)象的狀態(tài)〔實(shí)例變量〕,或者整個(gè)類(lèi)所有對(duì)象共享的數(shù)據(jù)〔類(lèi)變量〕可以是任意的數(shù)據(jù)類(lèi)型19數(shù)據(jù)成員聲明語(yǔ)法形式[public|protected|private][static][final][transient][volatile]數(shù)據(jù)類(lèi)型變量名1[=變量初值],變量名2[=變量初值],…;說(shuō)明public、protected、private為訪問(wèn)控制符。static指明這是一個(gè)靜態(tài)成員變量〔類(lèi)變量〕。final指明變量的值不能被修改。transient指明變量是不需要序列化的。volatile指明變量是一個(gè)共享變量。20實(shí)例變量沒(méi)有static修飾的變量〔數(shù)據(jù)成員〕稱(chēng)為實(shí)例變量;存儲(chǔ)所有實(shí)例都需要的屬性,不同實(shí)例的屬性值可能不同;可通過(guò)下面的表達(dá)式訪問(wèn)實(shí)例屬性的值<實(shí)例名>.<實(shí)例變量名>21例:圓類(lèi)圓類(lèi)保存在文件Circle.java中,測(cè)試類(lèi)保存在文件ShapeTester.java中,兩文件放在相同的目錄下publicclassCircle{intradius;}publicclassShapeTester{publicstaticvoidmain(Stringargs[]){Circlex;x=newCircle();System.out.println(x);System.out.println("radius="+x.radius);}}運(yùn)行結(jié)果編譯后運(yùn)行結(jié)果如下:Circle@26b249radius=0說(shuō)明默認(rèn)的toString()返回:getClass().getName()+”@”+Integer.toHexString(hashCode())

例:矩形類(lèi)矩形類(lèi)保存在Rectangle.java中,測(cè)試類(lèi)保存在ShapeTester.java中,兩文件保存在相同目錄下publicclassRectangle{doublewidth=10.128;doubleheight=5.734;}publicclassShapeTester{publicstaticvoidmain(Stringargs[]){Circlex;Rectangley; x=newCircle();y=newRectangle();System.out.println(x+""+y);}}運(yùn)行結(jié)果編譯后運(yùn)行結(jié)果如下:Circle@82f0dbRectangle@92d342說(shuō)明Circle及Rectangle類(lèi)對(duì)象的狀態(tài)如圖類(lèi)變量〔靜態(tài)變量〕為該類(lèi)的所有對(duì)象共享用static修飾。在整個(gè)類(lèi)中只有一個(gè)值。類(lèi)初始化的同時(shí)就被賦值。適用情況類(lèi)中所有對(duì)象都相同的屬性。經(jīng)常需要共享的數(shù)據(jù)。系統(tǒng)中用到的一些常量值。引用格式<類(lèi)名|實(shí)例名>.<類(lèi)變量名>26例:具有類(lèi)變量的圓類(lèi)publicclassCircle{staticdoublePI=3.14159265;intradius;}當(dāng)我們生成Circle類(lèi)的實(shí)例時(shí),在每一個(gè)實(shí)例中并沒(méi)有存儲(chǔ)PI的值,PI的值存儲(chǔ)在類(lèi)中。對(duì)類(lèi)變量進(jìn)行測(cè)試publicclassClassVariableTester{publicstaticvoidmain(Stringargs[]){Circlex=newCircle();System.out.println(x.PI);System.out.println(Circle.PI);Circle.PI=3.14;System.out.println(x.PI);System.out.println(Circle.PI);}}運(yùn)行結(jié)果:3.141592653.141592653.143.14方法成員<2.2.3>分為實(shí)例方法和類(lèi)方法29語(yǔ)法形式[public|protected|private][static][final][abstract][native][synchronized]返回類(lèi)型

方法名([參數(shù)列表])[throwsexceptionList]{

方法體}30public、protected、private控制訪問(wèn)權(quán)限。static指明這是一個(gè)類(lèi)方法〔靜態(tài)方法〕。final指明這是一個(gè)終結(jié)方法。abstract指明這是一個(gè)抽象方法。native用來(lái)集成java代碼和其它語(yǔ)言的代碼〔本課程不涉及〕。synchronized用來(lái)控制多個(gè)并發(fā)線程對(duì)共享數(shù)據(jù)的訪問(wèn)。31返回類(lèi)型方法返回值的類(lèi)型,可以是任意的Java數(shù)據(jù)類(lèi)型;當(dāng)不需要返回值時(shí),返回類(lèi)型為void。參數(shù)類(lèi)型簡(jiǎn)單數(shù)據(jù)類(lèi)型、引用類(lèi)型(數(shù)組、類(lèi)或接口);可以有多個(gè)參數(shù),也可以沒(méi)有參數(shù),方法聲明時(shí)的參數(shù)稱(chēng)為形式參數(shù)。方法體方法的實(shí)現(xiàn);包括局部變量的聲明以及所有合法的Java語(yǔ)句;局部變量的作用域只在該方法內(nèi)部。throwsexceptionList拋出異常列表。32實(shí)例方法表示特定對(duì)象的行為;聲明時(shí)前面不加static修飾符;33實(shí)例方法調(diào)用給對(duì)象發(fā)消息,使用對(duì)象的某個(gè)行為/功能:調(diào)用對(duì)象的某個(gè)方法。實(shí)例方法調(diào)用格式<對(duì)象名>.<方法名>〔[參數(shù)列表]〕<對(duì)象名>為消息的接收者。參數(shù)傳遞值傳遞:參數(shù)類(lèi)型為根本數(shù)據(jù)類(lèi)型時(shí)引用傳遞:參數(shù)類(lèi)型為對(duì)象類(lèi)型或數(shù)組時(shí)34例:具有實(shí)例方法的圓類(lèi)publicclassCircle{staticdoublePI=3.14159265;intradius;publicdoublecircumference(){return2*PI*radius;}publicvoidenlarge(intfactor){radius=radius*factor;} publicbooleanfitsInside(Rectangler){return(2*radius<r.width)&&(2*radius<r.height); }}圓類(lèi)的測(cè)試類(lèi)publicclassInsideTester{publicstaticvoidmain(Stringargs[]){ Circlec1=newCircle(); c1.radius=8; Circlec2=newCircle(); c2.radius=15; Rectangler=newRectangle(); r.width=20; r.height=30; System.out.println("Circle1fitsinsideRectangle:"+c1.fitsInside(r)); System.out.println("Circle2fitsinsideRectangle:"+c2.fitsInside(r));}}運(yùn)行結(jié)果Circle1fitsinsideRectangle:trueCircle2fitsinsideRectangle:false類(lèi)方法表示類(lèi)中對(duì)象的共有行為也稱(chēng)為靜態(tài)方法,聲明時(shí)前面需加static修飾。不能被聲明為抽象的??梢灶?lèi)名直接調(diào)用,也可用類(lèi)實(shí)例調(diào)用。38例:溫度轉(zhuǎn)換將攝氏溫度(centigrade)轉(zhuǎn)換成華氏溫度(fahrenheit)轉(zhuǎn)換公式為fahrenheit=centigrade*9/5+32除了攝氏溫度值及公式中需要的常量值,此功能不依賴(lài)于具體的類(lèi)實(shí)例的屬性值,因此可聲明為類(lèi)方法轉(zhuǎn)換方法centigradeToFahrenheit放在類(lèi)Converter中publicclassConverter{publicstaticintcentigradeToFahrenheit(intcent){return(cent*9/5+32);}}方法調(diào)用Converter.centigradeToFahrenheit(40)40可變長(zhǎng)參數(shù)可變長(zhǎng)參數(shù)使用省略號(hào)表示,其實(shí)質(zhì)是數(shù)組。例如,“String…s”表示“String[]s”。對(duì)于具有可變長(zhǎng)參數(shù)的方法,傳遞給可變長(zhǎng)參數(shù)的實(shí)際參數(shù)可以是零個(gè)到多個(gè)對(duì)象。例:可變長(zhǎng)參數(shù)staticdoublemaxArea(Circlec,Rectangle...varRec){Rectangle[]rec=varRec;for(Rectangler:rec){//…}}

publicstaticvoidmain(String[]args){Circlec=newCircle();Rectangler1=newRectangle();Rectangler2=newRectangle();System.out.println("maxareaofc,r1andr2is"+maxArea(c,r1,r2));System.out.println("maxareaofcandr1is"+maxArea(c,r1));System.out.println("maxareaofcandr2is"+maxArea(c,r2));System.out.println("maxareaofonlycis"+maxArea(c));}包<2.2.4>42包是一組類(lèi)的集合一個(gè)包可以包含假設(shè)干個(gè)類(lèi)文件,還可包含假設(shè)干個(gè)包43包的作用將相關(guān)的源代碼文件組織在一起。類(lèi)名的空間管理,利用包來(lái)劃分名字空間可以防止類(lèi)名沖突。提供包一級(jí)的封裝及存取權(quán)限。44包的命名每個(gè)包的名稱(chēng)必須是“獨(dú)一無(wú)二”的。Java中包名使用小寫(xiě)字母表示。命名方式建議將機(jī)構(gòu)的Internet域名反序,作為包名的前導(dǎo);假設(shè)包名中有任何不可用于標(biāo)識(shí)符的字符,用下劃線替代;假設(shè)包名中的任何局部與關(guān)鍵字沖突,后綴下劃線;假設(shè)包名中的任何局部以數(shù)字或其他不能用作標(biāo)識(shí)符起始的字符開(kāi)頭,前綴下劃線。45編譯單元一個(gè)Java源代碼文件稱(chēng)為一個(gè)編譯單元,由三局部組成:所屬包的聲明〔省略,那么屬于默認(rèn)包〕;Import〔引入〕包的聲明,用于導(dǎo)入外部的類(lèi);類(lèi)和接口的聲明。一個(gè)編譯單元中只能有一個(gè)public類(lèi),該類(lèi)名與文件名相同,編譯單元中的其他類(lèi)往往是public類(lèi)的輔助類(lèi),經(jīng)過(guò)編譯,每個(gè)類(lèi)都會(huì)產(chǎn)一個(gè)class文件。46包的聲明命名的包〔NamedPackages〕例如:packageMypackage;默認(rèn)包〔未命名的包〕不含有包聲明的編譯單元是默認(rèn)包的一局部。47包與目錄包名就是文件夾名,即目錄名;目錄名并不一定是包名;48引入包為了使用其它包中所提供的類(lèi),需要使用import語(yǔ)句引入所需要的類(lèi)。Java編譯器為所有程序自動(dòng)引入包java.lang。import語(yǔ)句的格式:importpackage1[.package2…].(classname|*);package1[.package2…]說(shuō)明包的層次,對(duì)應(yīng)于文件目錄;classname指明所要引入的類(lèi)名;如果要引入一個(gè)包中的所有類(lèi),可以使用星號(hào)〔*〕來(lái)代替類(lèi)名。4950靜態(tài)引入如果在程序中需要屢次使用靜態(tài)成員,那么每次使用都加上類(lèi)名太繁瑣。用靜態(tài)引入可以解決這一問(wèn)題。單一引入是指引入某一個(gè)指定的靜態(tài)成員,例如:importstaticjava.lang.Math.PI;全體引入是指引入類(lèi)中所有的靜態(tài)成員,例如:importstaticjava.lang.Math.*;例如:importstaticjava.lang.Math.PI;publicclassCircle{intradius;publicdoublecircumference(){return2*PI*radius;}}類(lèi)的訪問(wèn)權(quán)限控制<3.2.6>5152類(lèi)在不同范圍是否可以被訪問(wèn):類(lèi)型無(wú)修飾(默認(rèn))public同一包中的類(lèi)是是不同包中的類(lèi)否是類(lèi)的訪問(wèn)權(quán)限控制53公有(public)可以被其他任何方法訪問(wèn)(前提是對(duì)類(lèi)成員所屬的類(lèi)有訪問(wèn)權(quán)限)保護(hù)(protected)只可被同一類(lèi)及其子類(lèi)的方法訪問(wèn)私有(private)只可被同一類(lèi)的方法訪問(wèn)默認(rèn)(default)僅允許同一個(gè)包內(nèi)的訪問(wèn);又被稱(chēng)為“包〔package)訪問(wèn)權(quán)限”類(lèi)的成員訪問(wèn)權(quán)限控制54類(lèi)型private無(wú)修飾protectedpublic同一類(lèi)是是是是同一包中的子類(lèi)否是是是同一包中的非子類(lèi)否是是是不同包中的子類(lèi)否否是是不同包中的非子類(lèi)否否否是類(lèi)成員在不同范圍是否可以被訪問(wèn)例:改進(jìn)的圓類(lèi)將實(shí)例變量設(shè)置為privatepublicclassCircle{staticdoublePI=3.14159265;

privateintradius;

publicdoublecircumference(){return2*PI*radius;}}例:改進(jìn)的圓類(lèi)再編譯CircumferenceTester.javapublicclassCircumferenceTester{publicstaticvoidmain(Stringargs[]){Circlec1=newCircle();

c1.radius=50;Circlec2=newCircle();

c2.radius=10; doublecircum1=c1.circumference();doublecircum2=c2.circumference();("Circle1hascircumference"+circum1);

("Circle2hascircumference"+circum2);

}}例:改進(jìn)的圓類(lèi)編譯時(shí)會(huì)提示出錯(cuò)在編譯語(yǔ)句“c1.radius=50;”及“c2.radius=10;”時(shí)會(huì)提示存在語(yǔ)法錯(cuò)誤“radiushasprivateaccessinCircle”說(shuō)錯(cuò)誤原因Circle類(lèi)中變量radius被聲明為private,在其它類(lèi)中不能直接訪問(wèn)radius;如果要允許其它類(lèi)訪問(wèn)radius的值,需要在Circle類(lèi)中聲明相應(yīng)的公有方法。通常有兩類(lèi)典型的方法用于訪問(wèn)屬性值,get方法及set方法5859功能是取得屬性變量的值get方法名以“get”開(kāi)頭,后面是實(shí)例變量的名字例如:publicintgetRadius(){returnradius;}get方法60功能是修改屬性變量的值set方法名以“set”開(kāi)頭,后面是實(shí)例變量的名字例如:publicvoidsetRadius(intr){radius=r;}set方法如果方法的局部變量〔包括形參〕與類(lèi)的非靜態(tài)成員同名怎么辦?6162如果方法內(nèi)的局部變量〔包括形參〕名與實(shí)例變量名相同,那么方法體內(nèi)訪問(wèn)實(shí)例變量時(shí)需要this關(guān)鍵字。例如:publicvoidsetRadius(intradius){this.radius=radius;}this關(guān)鍵字對(duì)象初始化<2.3.1>6364對(duì)象初始化系統(tǒng)在生成對(duì)象時(shí),會(huì)為對(duì)象分配內(nèi)存空間,并自動(dòng)調(diào)用構(gòu)造方法對(duì)實(shí)例變量進(jìn)行初始化對(duì)象回收對(duì)象不再使用時(shí),系統(tǒng)會(huì)調(diào)用垃圾回收程序?qū)⑵湔加玫膬?nèi)存回收65構(gòu)造方法用來(lái)初始化對(duì)象每個(gè)類(lèi)都需要有構(gòu)造方法66方法名與類(lèi)名相同;不定義返回類(lèi)型;通常被聲明為公有的(public);可以有任意多個(gè)參數(shù);主要作用是完成對(duì)象的初始化工作;不能在程序中顯式的調(diào)用;在生成一個(gè)對(duì)象時(shí),會(huì)自動(dòng)調(diào)用該類(lèi)的構(gòu)造方法為新對(duì)象初始化;假設(shè)未顯式聲明構(gòu)造方法,編譯器隱含生成默認(rèn)的構(gòu)造方法。構(gòu)造方法67沒(méi)有參數(shù)〔內(nèi)部類(lèi)除外〕,方法體為空;使用默認(rèn)的構(gòu)造方法初始化對(duì)象時(shí),如果在類(lèi)聲明中沒(méi)有給實(shí)例變量賦初值,那么對(duì)象的屬性值為零或空;默認(rèn)構(gòu)造方法例:一個(gè)銀行帳號(hào)類(lèi)及測(cè)試代碼publicclassBankAccount{

String

ownerName;intaccountNumber;float

balance;}publicclassBankTester{publicstaticvoidmain(Stringargs[]){ BankAccountmyAccount=newBankAccount(); System.out.println("ownerName="+myAccount.ownerName);System.out.println("accountNumber="+myAccount.accountNumber); System.out.println("balance="+myAccount.balance); }}運(yùn)行結(jié)果ownerName=nullaccountNumber=0balance=0.0如何自定義構(gòu)造方法,使新對(duì)象按照程序員設(shè)計(jì)的方式被初始化?——自定義構(gòu)造方法。6970在生成對(duì)象時(shí)給構(gòu)造方法傳送初始值,為對(duì)象進(jìn)行初始化。構(gòu)造方法可以被重載一個(gè)類(lèi)中有兩個(gè)及以上同名的方法,但參數(shù)表不同,這種情況就被稱(chēng)為方法重載。在方法調(diào)用時(shí),可以通過(guò)參數(shù)列表的不同來(lái)區(qū)分應(yīng)調(diào)用哪一個(gè)方法。只要顯式聲明了構(gòu)造方法,編譯器就不再生成默認(rèn)的構(gòu)造方法。也可以顯式聲明無(wú)參數(shù)的造方法,方法體中可以定義默認(rèn)初始化方式。自定義構(gòu)造方法與方法重載例:為銀行帳號(hào)類(lèi)增加構(gòu)造方法為BankAccount聲明一個(gè)有三個(gè)參數(shù)的構(gòu)造方法publicBankAccount(StringinitName,intinitAccountNumber,floatinitBalance){ownerName=initName;accountNumber=initAccountNumber;balance=initBalance;}假設(shè)一個(gè)新帳號(hào)的初始余額可以為0,那么可增加一個(gè)帶有兩個(gè)參數(shù)的構(gòu)造方法publicBankAccount(StringinitName,intinitAccountNumber){ownerName=initName;accountNumber=initAccountNumber;balance=0.0f;}無(wú)參數(shù)的構(gòu)造方法——自定義默認(rèn)的初始化方式publicBankAccount(){ownerName="";accountNumber=999999;balance=0.0f;}初始化邏輯相同,只是初始值不同的多個(gè)重載構(gòu)造方法,需要冗余地寫(xiě)多個(gè)方法體嗎?73可以使用this關(guān)鍵字在一個(gè)構(gòu)造方法中調(diào)用另外的構(gòu)造方法;代碼更簡(jiǎn)潔,維護(hù)起來(lái)也更容易;通常用參數(shù)個(gè)數(shù)比較少的構(gòu)造方法調(diào)用參數(shù)個(gè)數(shù)最多的構(gòu)造方法。聲明構(gòu)造方法時(shí)使用this關(guān)鍵字例:使用this的重載構(gòu)造方法publicBankAccount(){this("",999999,0.0f);}publicBankAccount(StringinitName,intinitAccountNumber){ this(initName,initAccountNumber,0.0f);}publicBankAccount(StringinitName,intinitAccountNumber,floatinitBalance){ownerName=initName;accountNumber=initAccountNumber;balance=initBalance;

}7475在類(lèi)中定義變量時(shí),加上final修飾,那便是說(shuō),這個(gè)變量一旦被初始化便不可改變;實(shí)例變量和類(lèi)變量都可被聲明為final;final實(shí)例變量可以在類(lèi)中定義時(shí)給出初始值,或者在每個(gè)構(gòu)造方法結(jié)束之前完成初始化;final類(lèi)變量必須在聲明的同時(shí)初始化。final變量的初始化內(nèi)存回收76當(dāng)一個(gè)對(duì)象在程序中不再被使用時(shí),就成為一個(gè)無(wú)用對(duì)象將在必要時(shí)被自動(dòng)回收7778無(wú)用對(duì)象離開(kāi)了作用域的對(duì)象;無(wú)引用指向?qū)ο?。Java運(yùn)行時(shí)系統(tǒng)通過(guò)垃圾收集器周期性地釋放無(wú)用對(duì)象所使用的內(nèi)存。Java運(yùn)行時(shí)系統(tǒng)會(huì)在對(duì)對(duì)象進(jìn)行自動(dòng)垃圾回收前,自動(dòng)調(diào)用對(duì)象的finalize()方法。對(duì)象的自動(dòng)回收79自動(dòng)掃描對(duì)象的動(dòng)態(tài)內(nèi)存區(qū),對(duì)不再使用的對(duì)象做上標(biāo)記以進(jìn)行垃圾回收作為一個(gè)后臺(tái)線程運(yùn)行,通常在系統(tǒng)空閑時(shí)異步地執(zhí)行。垃圾收集器在對(duì)象被回收之前的最后時(shí)刻,會(huì)自動(dòng)調(diào)用名為finalize的方法??梢栽谶@個(gè)方法中釋放資源。8081在類(lèi)中聲明,因此Java中的每一個(gè)類(lèi)都有該方法:protectedvoidfinalize()throwsthrowable用于釋放資源。類(lèi)可以覆蓋〔重寫(xiě)〕finalize()方法。finalize()方法有可能在任何時(shí)機(jī)以任何次序執(zhí)行。finalize()方法枚舉類(lèi)<2.4>82對(duì)象的可取值為可列舉的特定的值時(shí),可以使用枚舉類(lèi)型8384[public]enum枚舉類(lèi)型名稱(chēng)

[implements

接口名稱(chēng)列表]{

枚舉值;變量成員聲明及初始化;方法聲明及方法體;}

聲明枚舉類(lèi)85例:簡(jiǎn)單的枚舉類(lèi)型enumScore{EXCELLENT,QUALIFIED,FAILED;};publicclassScoreTester{publicstaticvoidmain(String[]args){giveScore(Score.EXCELLENT);}

例:簡(jiǎn)單的枚舉類(lèi)型〔續(xù)〕publicstaticvoidgiveScore(Scores){switch(s){caseEXCELLENT:System.out.println("Excellent");break;caseQUALIFIED:System.out.println("Qualified");break;caseFAILED:System.out.println("Failed");break;}}}枚舉類(lèi)中也可以聲明構(gòu)造方法和其他用于操作枚舉對(duì)象的方法87枚舉類(lèi)的特點(diǎn)枚舉定義實(shí)際上是定義了一個(gè)類(lèi);所有枚舉類(lèi)型都隱含繼承〔擴(kuò)展〕自,因此枚舉類(lèi)型不能再繼承其他任何類(lèi);枚舉類(lèi)型的類(lèi)體中可以包括方法和變量;枚舉類(lèi)型的構(gòu)造方法必須是包內(nèi)私有或者私有的。定義在枚舉開(kāi)頭的常量會(huì)被自動(dòng)創(chuàng)立,不能顯式地調(diào)用枚舉類(lèi)的構(gòu)造方法。88枚舉類(lèi)型的默認(rèn)方法靜態(tài)的values()方法用于獲得枚舉類(lèi)型的枚舉值的數(shù)組;toString方法返回枚舉值的字符串描述;valueOf方法將以字符串形式表示的枚舉值轉(zhuǎn)化為枚舉類(lèi)型的對(duì)象;ordinal方法獲得對(duì)象在枚舉類(lèi)型中的位置索引。89例:聲明了變量和方法的枚舉類(lèi)publicenumPlanet{MERCURY(3.303e+23,2.4397e6),VENUS(4.869e+24,6.0518e6),EARTH(5.976e+24,6.37814e6),MARS(6.421e+23,3.3972e6),JUPITER(1.9e+27,7.1492e7),SATURN(5.688e+26,6.0268e7),URANUS(8.686e+25,2.5559e7),NEPTUNE(1.024e+26,2.4746e7);

privatefinaldoublemass;//inkilogramsprivatefinaldoubleradius;//inmetersPlanet(doublemass,doubleradius){this.mass=mass;this.radius=radius;}90說(shuō)明:本例取自于《TheJavaTutorials》〔〕Planet是一個(gè)代表太陽(yáng)系中行星的枚舉類(lèi)型,其中定義了mass和radius常量〔final〕成員。例:聲明了變量和方法的枚舉類(lèi)〔續(xù)〕privatedoublemass(){returnmass;}

privatedoubleradius(){returnradius;}//universalgravitationalconstant(m3kg-1s-2)publicstaticfinaldoubleG=6.67300E-11;doublesurfaceGravity(){returnG*mass/(radius*radius);}doublesurfaceWeight(doubleotherMass){returnotherMass*surfaceGravity();}91例:聲明了變量和方法的枚舉類(lèi)〔續(xù)〕publicstaticvoidmain(String[]args){if(args.length!=1){System.err.println("Usage:javaPlanet<earth_weight>");System.exit(-1);}doubleearthWeight=Double.parseDouble(args[0]);doublemass=earthWeight/EARTH.surfaceGravity();for(Planetp:Planet.values())System.out.printf("Yourweighton%sis%f%n",p,p.surfaceWeight(mass));}}92例:聲明了變量和方法的枚舉類(lèi)〔續(xù)〕從命令行運(yùn)行程序:javaPlanet175YourweightonMERCURYis66.107583YourweightonVENUSis158.374842YourweightonEARTHis175.000000YourweightonMARSis66.279007YourweightonJUPITERis442.847567YourweightonSATURNis186.552719YourweightonURANUSis158.397260YourweightonNEPTUNEis199.20741393應(yīng)用舉例<2.5>94初步的BankAccount類(lèi)—BankAccount.java包括狀態(tài)、構(gòu)造方法、get方法及set方法publicclassBankAccount{ privateStringownerName; privateintaccountNumber; privatefloatbalance; publicBankAccount(){ this("",0,0); } publicBankAccount(StringinitName,intinitAccNum,floatinitBal){ ownerName=initName; accountNumber=initAccNum; balance=initBal; } 95BankAccount.java(續(xù))publicStringgetOwnerName(){returnownerName;}publicintgetAccountNumber(){returnaccountNumber;}publicfloatgetBalance(){returnbalance;}publicvoidsetOwnerName(StringnewName){ownerName=newName;}publicvoidsetAccountNumber(intnewNum){accountNumber=newNum;}publicvoidsetBalance(floatnewBalance){balance=newBalance;}}測(cè)試類(lèi)——AccountTester.javapublicclassAccountTester{publicstaticvoidmain(Stringargs[]){BankAccountanAccount;anAccount=newBankAccount("ZhangLi",100023,0);anAccount.setBalance(anAccount.getBalance()+100);System.out.println("Hereistheaccount:"+anAccount);System.out.println("Accountname:"+anAccount.getOwnerName());

System.out.println("Accountnumber:anAccount.getAccountNumber());System.out.println("Balance:$"+anAccount.getBalance());}}測(cè)試結(jié)果:Hereistheaccount:BankAccount@372a1aAccountname:ZhangLiAccountnumber:100023Balance:$100.098覆蓋toString()方法;聲明存取款方法;使用DecimalFormat類(lèi);聲明類(lèi)方法生成特殊的實(shí)例;聲明類(lèi)變量。對(duì)銀行帳戶(hù)類(lèi)進(jìn)行修改99toString()方法將對(duì)象的內(nèi)容轉(zhuǎn)換為字符串下面的兩行代碼等價(jià)System.out.println(anAccount);System.out.println(anAccount.toString());如果需要特殊的轉(zhuǎn)換功能,那么需要自己覆蓋toString()方法:必須被聲明為public;返回類(lèi)型為String;方法的名稱(chēng)必須為toString,且沒(méi)有參數(shù);在方法體中不要使用輸出方法()。覆蓋toString()方法為BankAccount覆蓋toString()方法覆蓋的toString()方法publicStringtoString(){return("Account#"+accountNumber+"withbalance$"+balance);}重新編譯BankAccount類(lèi),并運(yùn)行測(cè)試類(lèi)BankAccountTester,結(jié)果如下:Hereistheaccount:Account#100023withbalance$100.0Accountname:ZhangLiAccountnumber:100023Balance:$100.0存取款方法給BankAccount類(lèi)增加存款及取款方法//存款

publicfloatdeposit(floatanAmount){balance+=anAmount;return(balance);}

//取款

publicfloatwithdraw(floatanAmount){balance-=anAmount;return(anAmount);}測(cè)試存取款——修改AccountTester.javapublicclassAccountTester{publicstaticvoidmain(Stringargs[]){BankAccountanAccount;anAccount=newBankAccount("ZhangLi",100023,0);anAccount.setBalance(anAccount.getBalance()+100);System.out.println(anAccount);System.out.println();anAccount=newBankAccount("WangFang",100024,0);System.out.println(anAccount);

anAccount.deposit(225.67f);

anAccount.deposit(300.00f);System.out.println(anAccount);

anAccount.withdraw(400.17f);System.out.println(anAccount);}}測(cè)試結(jié)果Account#100023withbalance$100.0Account#100024withbalance$0.0Account#100024withbalance$525.67Account#100024withbalance$125.49997103DecimalFormat類(lèi)在java.text包中。在toString()方法中使用DecimalFormat類(lèi)的實(shí)例方法format對(duì)數(shù)據(jù)進(jìn)行格式化。DecimalFormat類(lèi)修改后的toString()方法publicStringtoString(){return("Account#"+accountNumber+"withbalance"+("$0.00").format(balance));}重新編譯BankAccount類(lèi),再運(yùn)行BankTester類(lèi),運(yùn)行結(jié)果如下:Account#100023withbalance$100.00Account#100024withbalance$0.00Account#100024withbalance$525.67Account#100024withbalance$125.50如果需要生成一些特殊的樣例賬戶(hù),可以聲明類(lèi)方法,生成特殊的實(shí)例。105使用類(lèi)方法生成特殊的實(shí)例publicstaticBankAccountexample1(){BankAccountba=newBankAccount();ba.setOwnerName("LiHong"); ba.setAccountNumber(554000);ba.deposit(1000); returnba;}publicstaticBankAccountexample2(){BankAccountba=newBankAccount();ba.setOwnerName("ZhaoWei");ba.setAccountNumber(554001);ba.deposit(1000);ba.deposit(2000);returnba;}publicstaticBankAccountemptyAccountExample(){BankAccountba=newBankAccount();

ba.setOwnerName("HeLi");ba.setAccountNumber(554002);returnba;}修改構(gòu)造方法,取消帳號(hào)參數(shù);不允許直接修改賬號(hào),取消setAccountNumber方法;增加類(lèi)變量LAST_ACCOUNT_NUMBER,初始值為0,當(dāng)生成一個(gè)新的BankAccount對(duì)象時(shí),其帳號(hào)〔accountNumber〕自動(dòng)設(shè)置為為L(zhǎng)AST_ACCOUNT_NUMBER的值累加1;取消setBalance方法,僅通過(guò)存取款在操作改變余額。修改賬號(hào)生成、余額變動(dòng)方式完整的BankAccount2.javapublicclassBankAccount2{privatestaticintLAST_ACCOUNT_NUMBER=0;

privateintaccountNumber;

privateStringownerName;

privatefloatbalance;

publicBankAccount2(){this("",0);}

publicBankAccount2(StringinitName){this(initName,0);}

publicBankAccount2(StringinitName,floatinitBal){

ownerName=initName;

accountNumber=++LAST_ACCOUNT_NUMBER;

balance=initBal;}完整的BankAccount2.java〔續(xù)〕publicstaticBankAccount2example1(){BankAccount2ba=newBankAccount2();ba.setOwnerName("LiHong");ba.deposit(1000);returnba;}publicstaticBankAccount2example2(){

BankAccount2ba=newBankAccount2();

ba.setOwnerName("ZhaoWei");

ba.dep

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論