![Java程序設(shè)計(jì)(鄭莉)-第2講_第1頁](http://file4.renrendoc.com/view11/M00/18/1E/wKhkGWXzlYmAJNeIAACSt9Nk0-I422.jpg)
![Java程序設(shè)計(jì)(鄭莉)-第2講_第2頁](http://file4.renrendoc.com/view11/M00/18/1E/wKhkGWXzlYmAJNeIAACSt9Nk0-I4222.jpg)
![Java程序設(shè)計(jì)(鄭莉)-第2講_第3頁](http://file4.renrendoc.com/view11/M00/18/1E/wKhkGWXzlYmAJNeIAACSt9Nk0-I4223.jpg)
![Java程序設(shè)計(jì)(鄭莉)-第2講_第4頁](http://file4.renrendoc.com/view11/M00/18/1E/wKhkGWXzlYmAJNeIAACSt9Nk0-I4224.jpg)
![Java程序設(shè)計(jì)(鄭莉)-第2講_第5頁](http://file4.renrendoc.com/view11/M00/18/1E/wKhkGWXzlYmAJNeIAACSt9Nk0-I4225.jpg)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1第
2講
類與對象清華大學(xué)鄭莉目錄面向?qū)ο蠓椒ǖ奶匦灶惻c對象根底對象初始化和回收枚舉類型應(yīng)用舉例2面向?qū)ο蠓椒ǖ奶匦?lt;2.1>抽象、封裝、繼承、多態(tài)3抽象忽略問題中與當(dāng)前目標(biāo)無關(guān)的方面只關(guān)注與當(dāng)前目標(biāo)有關(guān)的方面4例:鐘表數(shù)據(jù)(屬性)intHour;intMinute;intSecond;方法(行為)SetTime();ShowTime();5封裝封裝是一種信息隱蔽技術(shù)利用抽象數(shù)據(jù)類型將數(shù)據(jù)和基于數(shù)據(jù)的操作封裝在一起;用戶只能看到對象的封裝界面信息,對象的內(nèi)部細(xì)節(jié)對用戶是隱蔽的;封裝的目的在于將對象的使用者和設(shè)計(jì)者分開,使用者不必知道行為實(shí)現(xiàn)的細(xì)節(jié)。6繼承基于已有類產(chǎn)生新類的機(jī)制是指新的類可以獲得已有類〔稱為超類、基類或父類〕的屬性和行為,稱新類為已有類的子類〔也稱為派生類〕;在繼承過程中子類繼承了超類的特性,包括方法和實(shí)例變量;子類也可修改繼承的方法或增加新的方法;有助于解決軟件的可重用性問題,使程序結(jié)構(gòu)清晰,降低了編碼和維護(hù)的工作量。7單繼承一個(gè)子類只有單一的直接超類。多繼承一個(gè)子類可以有一個(gè)以上的直接超類。Java語言僅支持單繼承。8多態(tài)超類及其不同子類的對象可以響應(yīng)同名的消息,具體的實(shí)現(xiàn)方法卻不同;主要通過子類對父類方法的覆蓋來實(shí)現(xiàn)。9類聲明與對象創(chuàng)立<2.2>類與對象根底<2.2.1>10類與對象的關(guān)系類是對一類對象的描述;對象是類的具體實(shí)例。11類聲明 [public][abstract|final]class類名稱 [extends父類名稱][implements接口名稱列表] {
數(shù)據(jù)成員聲明及初始化; 方法聲明及方法體; }12class說明其后聲明的是一個(gè)類。extends如果所聲明的類是從某一父類派生而來,那么,父類的名字應(yīng)寫在extends之后implements如果所聲明的類要實(shí)現(xiàn)某些接口,那么,接口的名字應(yīng)寫在implements之后public說明此類為公有類abstract指明此類為抽象類final指明此類為終結(jié)類13例:鐘表類publicclassClock{//變量成員
inthour;intminute;intsecond;//方法成員
publicvoidsetTime(intnewH,intnewM,intnewS){hour=newH;minute=newM;second=news;}publicvoidshowTime(){System.out.println(hour+":"+minute+":"+second);}}對象聲明與創(chuàng)立創(chuàng)立類的實(shí)例〔對象〕,通過對象使用類的功能。15<人像>對象引用聲明語法類名引用變量名;例Clock是已經(jīng)聲明的類名,聲明引用變量aclock,用于存儲該類對象的引用:Clockaclock;聲明一個(gè)引用變量時(shí)并沒有生成對象。16對象的創(chuàng)立語法形式:
new<類名>()例如:aclock=newClock()
new的作用是:在內(nèi)存中為Clock類型的對象分配內(nèi)存空間;返回對象的引用。引用變量可以被賦以空值例如:aclock=null;17數(shù)據(jù)成員<2.2.2>18數(shù)據(jù)成員表示對象的狀態(tài)〔實(shí)例變量〕,或者整個(gè)類所有對象共享的數(shù)據(jù)〔類變量〕可以是任意的數(shù)據(jù)類型19數(shù)據(jù)成員聲明語法形式[public|protected|private][static][final][transient][volatile]數(shù)據(jù)類型變量名1[=變量初值],變量名2[=變量初值],…;說明public、protected、private為訪問控制符。static指明這是一個(gè)靜態(tài)成員變量〔類變量〕。final指明變量的值不能被修改。transient指明變量是不需要序列化的。volatile指明變量是一個(gè)共享變量。20實(shí)例變量沒有static修飾的變量〔數(shù)據(jù)成員〕稱為實(shí)例變量;存儲所有實(shí)例都需要的屬性,不同實(shí)例的屬性值可能不同;可通過下面的表達(dá)式訪問實(shí)例屬性的值<實(shí)例名>.<實(shí)例變量名>21例:圓類圓類保存在文件Circle.java中,測試類保存在文件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說明默認(rèn)的toString()返回:getClass().getName()+”@”+Integer.toHexString(hashCode())
例:矩形類矩形類保存在Rectangle.java中,測試類保存在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說明Circle及Rectangle類對象的狀態(tài)如圖類變量〔靜態(tài)變量〕為該類的所有對象共享用static修飾。在整個(gè)類中只有一個(gè)值。類初始化的同時(shí)就被賦值。適用情況類中所有對象都相同的屬性。經(jīng)常需要共享的數(shù)據(jù)。系統(tǒng)中用到的一些常量值。引用格式<類名|實(shí)例名>.<類變量名>26例:具有類變量的圓類publicclassCircle{staticdoublePI=3.14159265;intradius;}當(dāng)我們生成Circle類的實(shí)例時(shí),在每一個(gè)實(shí)例中并沒有存儲PI的值,PI的值存儲在類中。對類變量進(jìn)行測試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í)例方法和類方法29語法形式[public|protected|private][static][final][abstract][native][synchronized]返回類型
方法名([參數(shù)列表])[throwsexceptionList]{
方法體}30public、protected、private控制訪問權(quán)限。static指明這是一個(gè)類方法〔靜態(tài)方法〕。final指明這是一個(gè)終結(jié)方法。abstract指明這是一個(gè)抽象方法。native用來集成java代碼和其它語言的代碼〔本課程不涉及〕。synchronized用來控制多個(gè)并發(fā)線程對共享數(shù)據(jù)的訪問。31返回類型方法返回值的類型,可以是任意的Java數(shù)據(jù)類型;當(dāng)不需要返回值時(shí),返回類型為void。參數(shù)類型簡單數(shù)據(jù)類型、引用類型(數(shù)組、類或接口);可以有多個(gè)參數(shù),也可以沒有參數(shù),方法聲明時(shí)的參數(shù)稱為形式參數(shù)。方法體方法的實(shí)現(xiàn);包括局部變量的聲明以及所有合法的Java語句;局部變量的作用域只在該方法內(nèi)部。throwsexceptionList拋出異常列表。32實(shí)例方法表示特定對象的行為;聲明時(shí)前面不加static修飾符;33實(shí)例方法調(diào)用給對象發(fā)消息,使用對象的某個(gè)行為/功能:調(diào)用對象的某個(gè)方法。實(shí)例方法調(diào)用格式<對象名>.<方法名>〔[參數(shù)列表]〕<對象名>為消息的接收者。參數(shù)傳遞值傳遞:參數(shù)類型為根本數(shù)據(jù)類型時(shí)引用傳遞:參數(shù)類型為對象類型或數(shù)組時(shí)34例:具有實(shí)例方法的圓類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); }}圓類的測試類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類方法表示類中對象的共有行為也稱為靜態(tài)方法,聲明時(shí)前面需加static修飾。不能被聲明為抽象的??梢灶惷苯诱{(diào)用,也可用類實(shí)例調(diào)用。38例:溫度轉(zhuǎn)換將攝氏溫度(centigrade)轉(zhuǎn)換成華氏溫度(fahrenheit)轉(zhuǎn)換公式為fahrenheit=centigrade*9/5+32除了攝氏溫度值及公式中需要的常量值,此功能不依賴于具體的類實(shí)例的屬性值,因此可聲明為類方法轉(zhuǎn)換方法centigradeToFahrenheit放在類Converter中publicclassConverter{publicstaticintcentigradeToFahrenheit(intcent){return(cent*9/5+32);}}方法調(diào)用Converter.centigradeToFahrenheit(40)40可變長參數(shù)可變長參數(shù)使用省略號表示,其實(shí)質(zhì)是數(shù)組。例如,“String…s”表示“String[]s”。對于具有可變長參數(shù)的方法,傳遞給可變長參數(shù)的實(shí)際參數(shù)可以是零個(gè)到多個(gè)對象。例:可變長參數(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包是一組類的集合一個(gè)包可以包含假設(shè)干個(gè)類文件,還可包含假設(shè)干個(gè)包43包的作用將相關(guān)的源代碼文件組織在一起。類名的空間管理,利用包來劃分名字空間可以防止類名沖突。提供包一級的封裝及存取權(quán)限。44包的命名每個(gè)包的名稱必須是“獨(dú)一無二”的。Java中包名使用小寫字母表示。命名方式建議將機(jī)構(gòu)的Internet域名反序,作為包名的前導(dǎo);假設(shè)包名中有任何不可用于標(biāo)識符的字符,用下劃線替代;假設(shè)包名中的任何局部與關(guān)鍵字沖突,后綴下劃線;假設(shè)包名中的任何局部以數(shù)字或其他不能用作標(biāo)識符起始的字符開頭,前綴下劃線。45編譯單元一個(gè)Java源代碼文件稱為一個(gè)編譯單元,由三局部組成:所屬包的聲明〔省略,那么屬于默認(rèn)包〕;Import〔引入〕包的聲明,用于導(dǎo)入外部的類;類和接口的聲明。一個(gè)編譯單元中只能有一個(gè)public類,該類名與文件名相同,編譯單元中的其他類往往是public類的輔助類,經(jīng)過編譯,每個(gè)類都會產(chǎn)一個(gè)class文件。46包的聲明命名的包〔NamedPackages〕例如:packageMypackage;默認(rèn)包〔未命名的包〕不含有包聲明的編譯單元是默認(rèn)包的一局部。47包與目錄包名就是文件夾名,即目錄名;目錄名并不一定是包名;48引入包為了使用其它包中所提供的類,需要使用import語句引入所需要的類。Java編譯器為所有程序自動引入包java.lang。import語句的格式:importpackage1[.package2…].(classname|*);package1[.package2…]說明包的層次,對應(yīng)于文件目錄;classname指明所要引入的類名;如果要引入一個(gè)包中的所有類,可以使用星號〔*〕來代替類名。4950靜態(tài)引入如果在程序中需要屢次使用靜態(tài)成員,那么每次使用都加上類名太繁瑣。用靜態(tài)引入可以解決這一問題。單一引入是指引入某一個(gè)指定的靜態(tài)成員,例如:importstaticjava.lang.Math.PI;全體引入是指引入類中所有的靜態(tài)成員,例如:importstaticjava.lang.Math.*;例如:importstaticjava.lang.Math.PI;publicclassCircle{intradius;publicdoublecircumference(){return2*PI*radius;}}類的訪問權(quán)限控制<3.2.6>5152類在不同范圍是否可以被訪問:類型無修飾(默認(rèn))public同一包中的類是是不同包中的類否是類的訪問權(quán)限控制53公有(public)可以被其他任何方法訪問(前提是對類成員所屬的類有訪問權(quán)限)保護(hù)(protected)只可被同一類及其子類的方法訪問私有(private)只可被同一類的方法訪問默認(rèn)(default)僅允許同一個(gè)包內(nèi)的訪問;又被稱為“包〔package)訪問權(quán)限”類的成員訪問權(quán)限控制54類型private無修飾protectedpublic同一類是是是是同一包中的子類否是是是同一包中的非子類否是是是不同包中的子類否否是是不同包中的非子類否否否是類成員在不同范圍是否可以被訪問例:改進(jìn)的圓類將實(shí)例變量設(shè)置為privatepublicclassCircle{staticdoublePI=3.14159265;
privateintradius;
publicdoublecircumference(){return2*PI*radius;}}例:改進(jìn)的圓類再編譯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)的圓類編譯時(shí)會提示出錯(cuò)在編譯語句“c1.radius=50;”及“c2.radius=10;”時(shí)會提示存在語法錯(cuò)誤“radiushasprivateaccessinCircle”說錯(cuò)誤原因Circle類中變量radius被聲明為private,在其它類中不能直接訪問radius;如果要允許其它類訪問radius的值,需要在Circle類中聲明相應(yīng)的公有方法。通常有兩類典型的方法用于訪問屬性值,get方法及set方法5859功能是取得屬性變量的值get方法名以“get”開頭,后面是實(shí)例變量的名字例如:publicintgetRadius(){returnradius;}get方法60功能是修改屬性變量的值set方法名以“set”開頭,后面是實(shí)例變量的名字例如:publicvoidsetRadius(intr){radius=r;}set方法如果方法的局部變量〔包括形參〕與類的非靜態(tài)成員同名怎么辦?6162如果方法內(nèi)的局部變量〔包括形參〕名與實(shí)例變量名相同,那么方法體內(nèi)訪問實(shí)例變量時(shí)需要this關(guān)鍵字。例如:publicvoidsetRadius(intradius){this.radius=radius;}this關(guān)鍵字對象初始化<2.3.1>6364對象初始化系統(tǒng)在生成對象時(shí),會為對象分配內(nèi)存空間,并自動調(diào)用構(gòu)造方法對實(shí)例變量進(jìn)行初始化對象回收對象不再使用時(shí),系統(tǒng)會調(diào)用垃圾回收程序?qū)⑵湔加玫膬?nèi)存回收65構(gòu)造方法用來初始化對象每個(gè)類都需要有構(gòu)造方法66方法名與類名相同;不定義返回類型;通常被聲明為公有的(public);可以有任意多個(gè)參數(shù);主要作用是完成對象的初始化工作;不能在程序中顯式的調(diào)用;在生成一個(gè)對象時(shí),會自動調(diào)用該類的構(gòu)造方法為新對象初始化;假設(shè)未顯式聲明構(gòu)造方法,編譯器隱含生成默認(rèn)的構(gòu)造方法。構(gòu)造方法67沒有參數(shù)〔內(nèi)部類除外〕,方法體為空;使用默認(rèn)的構(gòu)造方法初始化對象時(shí),如果在類聲明中沒有給實(shí)例變量賦初值,那么對象的屬性值為零或空;默認(rèn)構(gòu)造方法例:一個(gè)銀行帳號類及測試代碼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)造方法,使新對象按照程序員設(shè)計(jì)的方式被初始化?——自定義構(gòu)造方法。6970在生成對象時(shí)給構(gòu)造方法傳送初始值,為對象進(jìn)行初始化。構(gòu)造方法可以被重載一個(gè)類中有兩個(gè)及以上同名的方法,但參數(shù)表不同,這種情況就被稱為方法重載。在方法調(diào)用時(shí),可以通過參數(shù)列表的不同來區(qū)分應(yīng)調(diào)用哪一個(gè)方法。只要顯式聲明了構(gòu)造方法,編譯器就不再生成默認(rèn)的構(gòu)造方法。也可以顯式聲明無參數(shù)的造方法,方法體中可以定義默認(rèn)初始化方式。自定義構(gòu)造方法與方法重載例:為銀行帳號類增加構(gòu)造方法為BankAccount聲明一個(gè)有三個(gè)參數(shù)的構(gòu)造方法publicBankAccount(StringinitName,intinitAccountNumber,floatinitBalance){ownerName=initName;accountNumber=initAccountNumber;balance=initBalance;}假設(shè)一個(gè)新帳號的初始余額可以為0,那么可增加一個(gè)帶有兩個(gè)參數(shù)的構(gòu)造方法publicBankAccount(StringinitName,intinitAccountNumber){ownerName=initName;accountNumber=initAccountNumber;balance=0.0f;}無參數(shù)的構(gòu)造方法——自定義默認(rèn)的初始化方式publicBankAccount(){ownerName="";accountNumber=999999;balance=0.0f;}初始化邏輯相同,只是初始值不同的多個(gè)重載構(gòu)造方法,需要冗余地寫多個(gè)方法體嗎?73可以使用this關(guān)鍵字在一個(gè)構(gòu)造方法中調(diào)用另外的構(gòu)造方法;代碼更簡潔,維護(hù)起來也更容易;通常用參數(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在類中定義變量時(shí),加上final修飾,那便是說,這個(gè)變量一旦被初始化便不可改變;實(shí)例變量和類變量都可被聲明為final;final實(shí)例變量可以在類中定義時(shí)給出初始值,或者在每個(gè)構(gòu)造方法結(jié)束之前完成初始化;final類變量必須在聲明的同時(shí)初始化。final變量的初始化內(nèi)存回收76當(dāng)一個(gè)對象在程序中不再被使用時(shí),就成為一個(gè)無用對象將在必要時(shí)被自動回收7778無用對象離開了作用域的對象;無引用指向?qū)ο?。Java運(yùn)行時(shí)系統(tǒng)通過垃圾收集器周期性地釋放無用對象所使用的內(nèi)存。Java運(yùn)行時(shí)系統(tǒng)會在對對象進(jìn)行自動垃圾回收前,自動調(diào)用對象的finalize()方法。對象的自動回收79自動掃描對象的動態(tài)內(nèi)存區(qū),對不再使用的對象做上標(biāo)記以進(jìn)行垃圾回收作為一個(gè)后臺線程運(yùn)行,通常在系統(tǒng)空閑時(shí)異步地執(zhí)行。垃圾收集器在對象被回收之前的最后時(shí)刻,會自動調(diào)用名為finalize的方法??梢栽谶@個(gè)方法中釋放資源。8081在類中聲明,因此Java中的每一個(gè)類都有該方法:protectedvoidfinalize()throwsthrowable用于釋放資源。類可以覆蓋〔重寫〕finalize()方法。finalize()方法有可能在任何時(shí)機(jī)以任何次序執(zhí)行。finalize()方法枚舉類<2.4>82對象的可取值為可列舉的特定的值時(shí),可以使用枚舉類型8384[public]enum枚舉類型名稱
[implements
接口名稱列表]{
枚舉值;變量成員聲明及初始化;方法聲明及方法體;}
聲明枚舉類85例:簡單的枚舉類型enumScore{EXCELLENT,QUALIFIED,FAILED;};publicclassScoreTester{publicstaticvoidmain(String[]args){giveScore(Score.EXCELLENT);}
例:簡單的枚舉類型〔續(xù)〕publicstaticvoidgiveScore(Scores){switch(s){caseEXCELLENT:System.out.println("Excellent");break;caseQUALIFIED:System.out.println("Qualified");break;caseFAILED:System.out.println("Failed");break;}}}枚舉類中也可以聲明構(gòu)造方法和其他用于操作枚舉對象的方法87枚舉類的特點(diǎn)枚舉定義實(shí)際上是定義了一個(gè)類;所有枚舉類型都隱含繼承〔擴(kuò)展〕自,因此枚舉類型不能再繼承其他任何類;枚舉類型的類體中可以包括方法和變量;枚舉類型的構(gòu)造方法必須是包內(nèi)私有或者私有的。定義在枚舉開頭的常量會被自動創(chuàng)立,不能顯式地調(diào)用枚舉類的構(gòu)造方法。88枚舉類型的默認(rèn)方法靜態(tài)的values()方法用于獲得枚舉類型的枚舉值的數(shù)組;toString方法返回枚舉值的字符串描述;valueOf方法將以字符串形式表示的枚舉值轉(zhuǎn)化為枚舉類型的對象;ordinal方法獲得對象在枚舉類型中的位置索引。89例:聲明了變量和方法的枚舉類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說明:本例取自于《TheJavaTutorials》〔〕Planet是一個(gè)代表太陽系中行星的枚舉類型,其中定義了mass和radius常量〔final〕成員。例:聲明了變量和方法的枚舉類〔續(xù)〕privatedoublemass(){returnmass;}
privatedoubleradius(){returnradius;}//universalgravitationalconstant(m3kg-1s-2)publicstaticfinaldoubleG=6.67300E-11;doublesurfaceGravity(){returnG*mass/(radius*radius);}doublesurfaceWeight(doubleotherMass){returnotherMass*surfaceGravity();}91例:聲明了變量和方法的枚舉類〔續(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例:聲明了變量和方法的枚舉類〔續(xù)〕從命令行運(yùn)行程序:javaPlanet175YourweightonMERCURYis66.107583YourweightonVENUSis158.374842YourweightonEARTHis175.000000YourweightonMARSis66.279007YourweightonJUPITERis442.847567YourweightonSATURNis186.552719YourweightonURANUSis158.397260YourweightonNEPTUNEis199.20741393應(yīng)用舉例<2.5>94初步的BankAccount類—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;}}測試類——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());}}測試結(jié)果:Hereistheaccount:BankAccount@372a1aAccountname:ZhangLiAccountnumber:100023Balance:$100.098覆蓋toString()方法;聲明存取款方法;使用DecimalFormat類;聲明類方法生成特殊的實(shí)例;聲明類變量。對銀行帳戶類進(jìn)行修改99toString()方法將對象的內(nèi)容轉(zhuǎn)換為字符串下面的兩行代碼等價(jià)System.out.println(anAccount);System.out.println(anAccount.toString());如果需要特殊的轉(zhuǎn)換功能,那么需要自己覆蓋toString()方法:必須被聲明為public;返回類型為String;方法的名稱必須為toString,且沒有參數(shù);在方法體中不要使用輸出方法()。覆蓋toString()方法為BankAccount覆蓋toString()方法覆蓋的toString()方法publicStringtoString(){return("Account#"+accountNumber+"withbalance$"+balance);}重新編譯BankAccount類,并運(yùn)行測試類BankAccountTester,結(jié)果如下:Hereistheaccount:Account#100023withbalance$100.0Accountname:ZhangLiAccountnumber:100023Balance:$100.0存取款方法給BankAccount類增加存款及取款方法//存款
publicfloatdeposit(floatanAmount){balance+=anAmount;return(balance);}
//取款
publicfloatwithdraw(floatanAmount){balance-=anAmount;return(anAmount);}測試存取款——修改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);}}測試結(jié)果Account#100023withbalance$100.0Account#100024withbalance$0.0Account#100024withbalance$525.67Account#100024withbalance$125.49997103DecimalFormat類在java.text包中。在toString()方法中使用DecimalFormat類的實(shí)例方法format對數(shù)據(jù)進(jìn)行格式化。DecimalFormat類修改后的toString()方法publicStringtoString(){return("Account#"+accountNumber+"withbalance"+("$0.00").format(balance));}重新編譯BankAccount類,再運(yùn)行BankTester類,運(yùn)行結(jié)果如下:Account#100023withbalance$100.00Account#100024withbalance$0.00Account#100024withbalance$525.67Account#100024withbalance$125.50如果需要生成一些特殊的樣例賬戶,可以聲明類方法,生成特殊的實(shí)例。105使用類方法生成特殊的實(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)造方法,取消帳號參數(shù);不允許直接修改賬號,取消setAccountNumber方法;增加類變量LAST_ACCOUNT_NUMBER,初始值為0,當(dāng)生成一個(gè)新的BankAccount對象時(shí),其帳號〔accountNumber〕自動設(shè)置為為LAST_ACCOUNT_NUMBER的值累加1;取消setBalance方法,僅通過存取款在操作改變余額。修改賬號生成、余額變動方式完整的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. 本站所有資源如無特殊說明,都需要本地電腦安裝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)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 科技產(chǎn)業(yè)發(fā)展中的挑戰(zhàn)與機(jī)遇并存
- 科技驅(qū)動下的創(chuàng)新思維與方法論
- 綠色農(nóng)業(yè)與清潔能源的雙贏策略
- 游泳場館的消防安全規(guī)范與實(shí)施
- 2025年烏蘭察布貨運(yùn)從業(yè)資格證模擬考試題
- 現(xiàn)代科技與小學(xué)美術(shù)教育的深度融合
- 智慧餐廳未來小微餐飲企業(yè)的發(fā)展方向
- 二零二五年度特殊教育機(jī)構(gòu)代課教師聘用合同范本
- 2025年度起重設(shè)備購銷與智能化制造設(shè)備維護(hù)合同
- 高效辦公環(huán)境下的學(xué)術(shù)研究策略
- 護(hù)理人文知識培訓(xùn)課件
- 建筑工程施工安全管理課件
- 2025年春新人教版數(shù)學(xué)七年級下冊教學(xué)課件 7.2.3 平行線的性質(zhì)(第1課時(shí))
- 安徽省合肥市2025年高三第一次教學(xué)質(zhì)量檢測地理試題(含答案)
- 2025年新合同管理工作計(jì)劃
- 統(tǒng)編版八年級下冊語文第三單元名著導(dǎo)讀《經(jīng)典常談》閱讀指導(dǎo) 學(xué)案(含練習(xí)題及答案)
- 風(fēng)光儲儲能項(xiàng)目PCS艙、電池艙吊裝方案
- TTJSFB 002-2024 綠色融資租賃項(xiàng)目評價(jià)指南
- 全新車位轉(zhuǎn)讓協(xié)議模板下載(2024版)
- 2024年江西電力職業(yè)技術(shù)學(xué)院單招職業(yè)技能測試題庫及答案解析
- 天合儲能:2024儲能專用電芯白皮書
評論
0/150
提交評論