java編程思想版第4章初始化和清除_第1頁
java編程思想版第4章初始化和清除_第2頁
java編程思想版第4章初始化和清除_第3頁
java編程思想版第4章初始化和清除_第4頁
java編程思想版第4章初始化和清除_第5頁
已閱讀5頁,還剩31頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

4始化和清“初始化”和“清除”是這些安全問題的其中兩個。許多C程序的錯誤都是用的資源會一直保留下去,極易產(chǎn)生資源(主要是內(nèi)存)用盡的。建之后自動調(diào)用。Java也沿用了這個概念,但新增了自己的“收集器,能Java如何提供它們的支持。用構(gòu)建器自動初始initialize()用的任何名字都可能與打算為某個類成員使用的名字第二是由于編譯器的Java里得到了應(yīng)用:構(gòu)建器的名字與類名相同。這樣一來,可保證象這樣的一個方在初始化期間自動調(diào)用。148-149//://DemonstrationofasimpleclassRockRock(){//ThisistheconstructorSystem.out.println("CreatingRock");}}publicclassSimpleConstructorpublicstaticvoidmain(String[]args){for(inti=0;i<10;i++)new}}new149//://ConstructorscanhaveclassRock2{Rock2(inti){"CreatingRocknumber"+}}publicclassSimpleConstructor2publicstaticvoidmain(String[]args){for(inti=0;i<10;i++)new}}Tree有一個構(gòu)建器,它用一個整數(shù)自變量標(biāo)記樹的高度,那么Tree對象:treetnewTree(12);12英尺高的Tree對象。initialize()方法的明確調(diào)用——那些方法在概念上獨立于定義內(nèi)容。在Java中,定義和初始化屬于統(tǒng)一的概念——兩者。void方法過我們用名字或描述所有對象與方法。若名字選得好,可使自己及其他人(prin()顯示浮點數(shù)——每個函數(shù)都要求具備唯一的名字。151-152//://Demonstrationofboth//andordinarymethodoverloading.importjava.util.*;classTreeintheight;Tree(){ ntingaseedling");height=0;}Tree(inti)prt("CreatingnewTreethatis"+i+"feettall");height=i;}voidinfo()prt("Treeis"+height+"feet}voidinfo(Strings)prt(s+":Treeis"+height+"feet}staticvoidprt(Strings){ publicclassOverloading{publicstaticvoidmain(String[]args)for(inti=0;i<5;i++){Treet=newTree(i);("overloaded //Overloadedconstructor:newTree();}}①:在Sun公司的一些Java資料中用簡陋但很說明問題的詞語稱呼這(no-constructorsinfo()方法。例如,假設(shè)我們有一條額區(qū)分過載方方法,因為它會產(chǎn)生難以的代碼:152-153//://Overloadingbasedontheorder//thepublicclassOverloadingOrder{staticvoidprint(Strings,inti){"String:"+s+",int:"+i);}staticvoidprint(inti,Strings){"int:"+i",String:"+}publicstaticvoidmain(String[]args){print("Stringfirst",11);print(99,"Int}}兩個主類型的過涉及過載問題時,這會稍微造成一些。下面這個例子揭示了將主類型傳遞給153-155//://PromotionofprimitivesandpublicclassPrimitiveOverloading//booleancan'tbeautomaticallyconvertedstaticvoidprt(Strings){}voidf1(charx){prt("f1(char)");voidf1(bytex){prt("f1(byte)");voidf1(shortx){prt("f1(short)");voidf1(intx){prt("f1(int)");voidf1(longx){prt("f1(long)");voidf1(floatx){prt("f1(float)");voidf1(doublex){prt("f1(double)");voidf2(bytex){prt("f2(byte)");voidf2(shortx){prt("f2(short)");voidf2(intx){prt("f2(int)");voidf2(longx){prt("f2(long)");voidf2(floatx){prt("f2(float)");voidf2(doublex){prt("f2(double)");voidf3(shortx){prt("f3(short)");voidf3(intx){prt("f3(int)");voidf3(longx){prt("f3(long)");voidf3(floatx){prt("f3(float)");voidf3(doublex){prt("f3(double)");voidf4(intx){prt("f4(int)");voidf4(longx){prt("f4(long)");voidf4(floatx){prt("f4(float)");voidf4(doublex){prt("f4(double)");voidf5(longx){prt("f5(long)");voidf5(floatx){prt("f5(float)");voidf5(doublex){prt("f5(double)");voidf6(floatx){prt("f6(float)");voidf6(doublex){prt("f6(double)");voidf7(doublex){prt("f7(double)");}voidtestConstVal(){prt("Testingwith5");}voidtestChar(){charx='x';prt("charargument:");}voidtestByte(){bytex=0;prt("byteargument:");}voidtestShort(){shortx=0;prt("shortargument:");}voidtestInt(){intx=0;prt("intargument:");}voidtestLong(){longx=0;prt("longargument:");}voidtestFloat(){floatx=0;prt("floatargument:");}voidtestDouble(){doublex=0;prt("doubleargument:");}publicstaticvoidmain(String[]args){PrimitiveOverloadingp=newPrimitiveOverloading();}}5int值處理。所以假我們的數(shù)據(jù)類“小于方法中使用的自變量就會對那種數(shù)據(jù)類型進(jìn)“”配,就會為int。155-157//://DemotionofprimitivesandpublicclassDemotion{staticvoidprt(Strings){}voidf1(charx){prt("f1(char)");voidf1(bytex){prt("f1(byte)");voidf1(shortx){prt("f1(short)");voidf1(intx){prt("f1(int)");voidf1(longx){prt("f1(long)");voidf1(floatx){prt("f1(float)");voidf1(doublex){prt("f1(double)");voidf2(charx){prt("f2(char)");voidf2(bytex){prt("f2(byte)");voidf2(shortx){prt("f2(short)");voidf2(intx){prt("f2(int)");voidf2(longx){prt("f2(long)");voidf2(floatx){prt("f2(float)");voidf3(charx){prt("f3(char)");voidf3(bytex){prt("f3(byte)");voidf3(shortx){prt("f3(short)");voidf3(intx){prt("f3(int)");voidf3(longx){prt("f3(long)");voidf4(charx){prt("f4(char)");voidf4(bytex){prt("f4(byte)");voidf4(shortx){prt("f4(short)");voidf4(intx){prt("f4(int)");voidf5(charx){prt("f5(char)");voidf5(bytex){prt("f5(byte)");voidf5(shortx){prt("f5(short)");voidf6(charx){prt("f6(char)");voidf6(bytex){prt("f6(byte)");voidf7(charx){prt("f7(char)");}voidtestDouble(){doublex=prt("doubleargument:");}publicstaticvoidmain(String[]args){Demotionp=newDemotion();}}大家可注意到這是一“縮小轉(zhuǎn)換也就是說在造型或過程中可能丟返回值過voidf()intf()若編譯器可根據(jù)上下文(語境)intx=f()中,那么Javaf()的具體調(diào)用方式呢?而且別人如何識別并理解代碼呢?由默認(rèn)構(gòu)建158//:classBird{inti;}publicclassDefaultConstructorpublicstaticvoidmain(String[]args){Birdnc=newBird();//default!}}newclassBush{Bush(inti){}Bush(doubled){}}newthis關(guān)鍵f()方法:classBanana{voidf(inti){/*...*/}}Bananaa=newBanana(),b=newBanana();若只有一個名叫f()的方法它怎樣才能知道自己是為a還是為b調(diào)用的呢?編譯器為我們完成了一些幕后工作。其中的就是第一個自變量傳遞給方法的關(guān)鍵字:this。this關(guān)鍵字(注意只能在方法)可為已調(diào)用了其方法thisthis句柄會自動應(yīng)用于其他方法。classApricotvoidpick(){/*...*/voidpit(){pick();/*...*/}在pit()內(nèi)部,我們可以說this.pick(),但事實上無此必要。編譯器能幫我們自return語句中使用。160//://Simpleuseofthe"this"publicclassLeaf{inti=0;Leafincrement(){return}voidprint(){System.out.println("i="+i);}publicstaticvoidmain(String[]args){Leafx=newLeaf();}}increment()通過this關(guān)鍵字返回當(dāng)前對象的句柄,所以可以方便地對同在構(gòu)建器里調(diào)用構(gòu)建this關(guān)鍵字做到這一點。this160-161//://CallingconstructorswithpublicclassFlower{intpetalCount=Strings=newString("null");Flower(intpetals){petalCount=petals;"Constructorw/intargonly,petalCount=+}Flower(Stringss){"Constructorw/Stringargonly,s="+ss);s=ss;}Flower(Strings,intpetals){ this(s);//Can'tcallthis.s=s;//Anotheruseof"this"System.out.println("String&intargs");}Flower(){this("hi",47);"defaultconstructor(no}voidprint() this(11);//Notinsidenon-"petalCount="+petalCount+"s="+}publicstaticvoidmain(String[]args){Flowerx=newFlower();}}Flower(Strings,intpetals)向我們揭示出這樣一個問題:盡管可這個例子也向大家展示了this的另一項用途。由于自變量s的名字以及成員數(shù)據(jù)s的名字是相同的,所以會出現(xiàn)。為解決這個問題,可用this.s來Java代碼里看到這種形式的應(yīng)用,本書的大量地方也采static的含理解了this關(guān)鍵字后,我們可更完整地理解static(靜態(tài))方法的含義。它意味著一個特定的方法沒有this們不可從一個static方法內(nèi)部發(fā)出對非static方注釋②staticstatic方法最局函數(shù)不允許在Java中使用以外,若將一個static方法置入一個類的內(nèi)部,它就可以其他static方法以及static字段。②:有可能發(fā)出這類調(diào)用的一種情況是一個對象句柄傳到static方法內(nèi)部。隨后,通過句柄(此時實際是this,我們可調(diào)用非static方法,并非static方法并不是“面向?qū)ο蟆钡模驗樗鼈兙哂腥趾瘮?shù)的某staticthis。這己的策略。然而,static的概念是非常實用的,許多時候都需要用到它。所以至static的東西。清除:收尾和收。int呢?但是對于庫來說,用完后簡單地“釋放”一個對象并非總是安全的。當(dāng)然,Java可用收集器回收由不再使用的對象占據(jù)的內(nèi)存?,F(xiàn)在域,沒有使用new收集器只知道釋放那些由new分配的內(nèi)存,所以不知道如何釋放對象的“特殊”內(nèi)存。為解決這個問題,Javafinalize()旦收集器準(zhǔn)備好釋放對象占用的空間,它首先調(diào)用finalize(),而且只有在下一次收集過程中,才會真正回收對象的內(nèi)存。所以如果使用finalize(),就可以在收集期間進(jìn)行一些重要的清除或清掃工作。。但也是一個潛在的編程陷阱,因為有些程序員(特別是在C++開發(fā)背景的剛開始可能會錯誤認(rèn)為它就是在C++中為壞器”(Destructor)使用的C++JavaC++的對象肯定會被清除(排開編程錯誤的因素,而Java對象并非肯定能作為被“收集”去?;蛘邠Q句話說:收集并不等于“破壞Java并未提供“破壞器”或者類似的概念,所以必須創(chuàng)建一個原始的方法,用它果不從屏幕明確刪除它的圖像,那么它可能都不會被清除。若在finalize()里置入某種刪除機(jī)制,那么假設(shè)對象被當(dāng)作收掉了,圖像首先會將自身從屏幕我們的對象可能不會當(dāng)作被收掉有時可能發(fā)現(xiàn)一個對象的空間都不會釋放,因為自己的程序都接近于用光空間的臨界點。若程序執(zhí)行結(jié)束,而且收集器一直都沒有釋放我們創(chuàng)建的任何對象的空間則隨著程序的退出那些資源會返回給操作系統(tǒng)。這是一件好事情,因為收集本身也要消耗一些開銷。如都不用它,那么finalize()用途何也就是說收集器存在的唯一原因是為了回收程序不再使用的內(nèi)存以對于與收集有關(guān)的任何活動來說其中最值得注意的是finlie()方法們也必須同內(nèi)存以及它的回收有關(guān)。但這是否意味著假如對象包含了其他對象,finalie()就應(yīng)該明確釋放那些對象呢?答案是否定的——收集器會負(fù)責(zé)釋放所有對象占據(jù)的內(nèi)存無論這些finlie()我們的對象可采用與創(chuàng)建對象時不同的方法分配一些空間但大家或許會注意到,a中的所有東西都是對象,所以這到底是怎么一回事呢?finliz()a的法,通過分配內(nèi)存來做一些具有C風(fēng)格的事情。這主要可以通“固有方法”來進(jìn)行,它是從a里調(diào)用非a方法的式(固有方法的A討論CC++代碼內(nèi)部也許能調(diào)用C的malloc()系列數(shù)用它分配空間而且除非用了(),否則空間不會得到釋放,從而造成內(nèi)存“”的出現(xiàn)。當(dāng)然,()CC++finalize()內(nèi)部的一個固有方法中調(diào)finliz()應(yīng)在何處進(jìn)行呢?必須執(zhí)行清C++“C++C++對象創(chuàng)建成一個本地對象,比如在堆棧中創(chuàng)建(Java中是不可能的new創(chuàng)建的(JavaC++的delete命令時(Java沒有這個命令那么不會調(diào)用破壞器,我們最終得到的將是一個內(nèi)存“,另外還包括對象的其他部分不會得到清除。相反,Java不允許我們創(chuàng)建本地(局部)new。但在Java中,沒有“delete”命令來釋放對象,因為收集器會幫助我們自動釋放空間。所以如果站在比較簡化的立場,我們可以說正是由于存在收集制的需要(而且絕對不能直接調(diào)用finalize(),所以應(yīng)盡量避免用它。若希望執(zhí)行除釋放空間之外的其他某種形式的清除工作,仍然必須調(diào)用Java中的一C++的破壞器,只是沒后者方便。finalize()最有用處的地方之一是觀察收集的過程。下面這個例子向大家展示了收集所經(jīng)歷的過程,并對前面的陳述進(jìn)行了總結(jié)。165-166//://Demonstrationofthe//collectorandclassChairstaticbooleangcrun=false;staticbooleanf=false;staticintcreated=0;staticintfinalized=0;inti;Chair()i=++created;if(created==47)}publicvoidfinalize(){if(!gcrun){//Thefirsttimefinalize()iscalled:gcrun=true;"Beginningtofinalizeafter"created+"Chairshavebeen}if(i==47){"FinalizingChair#47,""SettingflagtostopChaircreation");f=true;}if(finalized>="All"+finalized+"}}publicclassGarbagepublicstaticvoidmain(String[]args)//Aslongastheflaghasn'tbeen//makeChairsandStrings:while(!Chair.f){newnewString("Totakeup}"AfterallChairshavebeencreated:\n"+"totalcreated="+Chair.created+",totalfinalized="+//Optionalarguments//collection&finalization:if(args.length>0){if(args[0].equals("gc")args[0].equals("all"))}if(args[0].equals("finalize")||args[0].equals("all")){}}}}上面這個程序創(chuàng)建了許多Chair對象,而且在收集器開始運行后的某些時候,程序會停止創(chuàng)建Chair。由于收集器可能在任何時間運行,所以我們生成。這兩個標(biāo)記都是在finalize()內(nèi)部設(shè)置的,它調(diào)用于收集期間。另兩個static變量——created以及finalized——分別用于已創(chuàng)建的對象己的(非static)inti,所以能了解它具體的編號是多少。編號為47的ChairtrueChair對象的創(chuàng)建過程。newChair();newString("Totakeup}finlize()47尾處理。每次循環(huán)過程中創(chuàng)建的String對象只是屬于額外的,用于吸引收集器——一旦收集器對可用內(nèi)存的容量感到“緊張不安,就會開始關(guān)注它?!癰efore”自變量會調(diào)用System.gc()方法(強(qiáng)制執(zhí)行收集器,同時還會調(diào)用System.runFinalization()Java1.0中方法卻只有這個方法,而且收尾程序的執(zhí)行與收集器是否運行是無關(guān)的。③不幸的是a1.0采用的收集器方案不能正確地調(diào)用finalie()。finlize()特別是那些用于關(guān)閉文件的事實上經(jīng)常都不會得到調(diào)用?,F(xiàn)在有些文章聲稱所有收尾模塊都會在程序退出的時候得到調(diào)用——即使到程序中止的時候,收集器仍未針對那些對象采取行動。這并不是真實的情況,finalize(能為所有對象而調(diào)用。特別地,fialie()va1.0Java1.1中,收尾模塊肯定會運行這一許諾已如“none”Created167-168Beginningtofinalizeafter3486ChairshavebeencreatedFinalizingChair#47,SettingflagtostopChaircreationAfterallChairshavebeencreated:totalcreated=3881,totalfinalized=2684System.gc()System.runFinalization()清除到目前為止沒有使用的所有對象。這樣做一個稍顯奇怪的地方是在調(diào)用runFinalization()gc()Sun公司的文檔說明有些抵觸,它宣稱首先運行收尾模塊,再釋放空間。然而,若在這里首先調(diào)用runFinalization()gc(),收尾模塊根本不會執(zhí)行。//://Usingfinalize()todetectanobject//hasn'tbeenproperlycleanedclassBookbooleancheckedOut=false;Book(booleancheckOut){checkedOut=}voidcheckIn(){checkedOut=}publicvoidfinalize(){System.out.println("Error:checked}}publicclassDeathConditionpublicstaticvoidmain(String[]args){Booknovel=newBook(true);//Propercleanup://Dropthereference,forgettocleanup:newBook(true); garbagecollection&finalization:}}④:到你讀到本書時,有些Java虛擬機(jī)(JVM)可能已開始表現(xiàn)出不同的行針對所有對象,Java1.1有時之所以會默認(rèn)為跳過收尾工作,是由于它認(rèn)為成員初始voidf(){inti;}為i賦予一個默認(rèn)值但它看起來更象一個程序員的此時默認(rèn)值反而“幫而,若為其賦予一個值,同樣是非常不安全的。因此,一個類的所有基本類169//://ShowsdefaultinitialclassMeasurement{booleant;charc;byteb;shorts;inti;longl;floatf;doubled;voidprint(){"DataInitialvalue\n""+t+"\n""+c+"\n""+b+"\n""+s+"\n""+i+"\n""+l+"\n""+f+"\n" "+}}publicclassInitialValuespublicstaticvoidmain(String[]args){Measurementd=newMeasurement();/*Inthiscaseyoucouldalsosay:newMeasurement().print();}}170DataInitial0000(NULL規(guī)定初始(C++里不能這C++的新手們總“想”這樣做。在下面,Measurement類內(nèi)部的字段170classMeasurement{booleanb=true;charc='x';byteB=47;shorts=0xff;inti=999;longl=1;floatf=3.14f;doubled=//..classMeasurement{Deptho=newDepth();booleanb=true;//..classCInit{inti=f();}classCInit{inti=f();intj=g(i);}但下面這樣做是的classCInit{intj=g(i);inti=f();}這正是編譯器對“向前”感到不適應(yīng)的一個地方,因為它與初始化的順構(gòu)建器初始classCounter{inti;Counter(){i=7;//..i7。對于所有基本類型以及對象句柄,進(jìn)行初始化,而且它對于對象來說是強(qiáng)制進(jìn)行的。參見《ThinkinginC++初始化順172-173//://Demonstratesinitialization//Whentheconstructoriscalledtocreate//Tagobject,you'llseeaclassTagTag(intmarker)System.out.println("Tag("+marker+}}classCardTagt1=newTag(1);//BeforeconstructorCard(){//Indicatewe'reintheconstructor:t3=newTag(33);//Reinitialize}Tagt2=newTag(2);//Afterconstructorvoidf(){}Tagt3=newTag(3);//At}publicclassOrderOfInitialization{publicstaticvoidmain(String[]args){Cardt=newt.f();//Showsthatconstructionis}}173一個對象會被丟棄,所以它后來可被當(dāng)作收掉。從表面看,這樣做似乎效t3t3靜態(tài)數(shù)據(jù)的初始(static(NULL到何時對那個區(qū)域進(jìn)行初始化的問題下面這個例子可將這個問題說更清楚174-175//://Specifyinginitialvaluesin//classclassBowlBowl(intmarker)System.out.println("Bowl("+marker+}voidf(intmarker){System.out.println("f("+marker+")");}}classTablestaticBowlb1=newBowl(1);Table(){}voidf2(intmarker){System.out.println("f2("+marker+")");}staticBowlb2=new}classCupboardBowlb3=newBowl(3);staticBowlb4=newBowl(4);Cupboard(){}voidf3(intmarker){System.out.println("f3("+marker+")");}staticBowlb5=new}publicclassStaticInitializationpublicstaticvoidmain(String[]args){"CreatingnewCupboard()inmain");newCupboard();"CreatingnewCupboard()inmain");newCupboard();}staticTablet2=newstaticCupboardt3=new}BowlTableCupboard能創(chuàng)建散布于類定義中的Bowlstatic注意在static定義之前,Cupboard先創(chuàng)建了一個static的Bowlb3。它的輸出結(jié)果如下:175CreatingnewCupboard()inmainCreatingnewCupboard()inmain都不Table.b1或Table.b2,那么staticBowlb1和b2都不會創(chuàng)建們才會創(chuàng)建。在那以后,static初始化的順序是首先static(如果它們尚未由前一次對象創(chuàng)建過程初始化,接著是非static對象。大家可從輸出結(jié)果中找到相應(yīng)的。DogDogDogstatic方法/static字段首次時,Java解釋器必須找到Dog.class(在事先設(shè)好的類路徑里搜索。找到Dog.class后(它會創(chuàng)建一個Class對象,這將在后面學(xué)到它的所為一個Dog對象分配足夠多的空間。這種空間會清為零將Dog中的所有基本類型設(shè)為它們的默認(rèn)(零booleanchar的等價設(shè)定。6章將要講到的那樣,這實際可能要求進(jìn)行相當(dāng)多明確進(jìn)行的靜態(tài)初始()176頁下程序classSpoon{staticinti;statici=}//..static關(guān)鍵字,后面跟隨一個方法個對象時,或者首次屬于那個類的一個static成員時(即便從未生成過那個176-177//://Explicitstatic//withthe"static"classCupCup(intmarker)System.out.println("Cup("+marker+}voidf(intmarker)System.out.println("f("+marker+}}classCups{staticCupc1;staticCupc2;static{c1=newCup(1);c2=new}Cups(){}}publicclassExplicitStaticpublicstaticvoidmain(String[]args){System.out.println("Insidemain()"); //(1)}//staticCupsx=new ////staticCupsy=new //}在標(biāo)記為(1)的行內(nèi)static對象c1的時候,或在行(1)標(biāo)記為注釋,同時(2)行不標(biāo)記成注釋的時候,用于Cups的static初始化模塊就會運行。若(1)和(2)都被標(biāo)記成注釋,則用于Cups的static初始化進(jìn)程不會發(fā)生。非靜態(tài)實例的初始177-178//://Java"InstanceInitialization."classMug{Mug(intmarker){System.out.println("Mug("+marker+")");}voidf(intmarker)System.out.println("f("+marker+}}publicclassMugs{Mugc1;Mugc2; c1=newMug(1);c2=newSystem.out.println("c1&c2}Mugs()}publicstaticvoidmain(String[]args)System.out.println("Inside Mugsx=new}}178 c1=newMug(1);c2=newSystem.out.println("c1&c2}它看起來與靜態(tài)初始化從句極其相似,只是static關(guān)鍵字從里面了。為支持對“內(nèi)部類”的初始化(參見第7章,必須采用這一語法格式。數(shù)組初始更安全(注釋⑥。Java則沒有象C++那樣的“集合”概念,因為Java中的所有([]int[]int還是前一種語法,因為它類型是“一個int數(shù)組。本書將沿用那種格式。任何空間。為了給數(shù)組創(chuàng)建相應(yīng)的空間,必須編寫一個初始化表達(dá)式。對于起來的值??臻g的分配(等價于使用new)將由編譯器在這種情況下進(jìn)行。int[]a1={1,2,3,4,5int[]Javaa2=我們真正準(zhǔn)備做的是一個句柄,就象下面演示的那樣180//://ArraysofpublicclassArrayspublicstaticvoidmain(String[]args){int[]a1={1,2,3,4,5};int[]a2;a2=for(inti=0;i<a2.length;i++)for(inti=0;i<a1.length;i++)"a1["+i+"]="+}}大家看到a1獲得了一個初始值,而a2沒有;a2將在以后賦值——這種情況了多少個元素。這個成員就是lengthCC++類似,由于Java數(shù)組從元素0開始計數(shù),所以能索引的最大元素編號是“l(fā)ength-1”。如超出邊界,C和C++會運行期錯誤(即一個“異常這是第9章的。當(dāng)然,由于需要檢查每個數(shù)意味著數(shù)組可能成為程序效率低下的重要原因——如果它們在關(guān)鍵的場合new180-181//://CreatingarrayswithimportpublicclassArrayNewstaticRandomrand=newRandom();staticintpRand(intmod){returnMath.abs(rand.nextInt())%mod+}publicstaticvoidmain(String[]args){int[]a;a=newint[pRand(20)];"lengthofa="+a.length);for(inti=0;i<a.length;i++)"a["+i+"]="+}}(pRand(方法(charnullbooleafaleint[]a=newneIntegr181-182//://Creatinganarrayofnonprimitiveobjects.importjava.util.*;publicclassArrayClassObjstaticRandomrand=newRandom();staticintpRand(intmod){returnMath.abs(rand.nextInt())%mod+1; publicstaticvoidmain(String[]args){Integer[]a=newInteger[pRand(20)];"lengthofa="+a.length);for(inti=0;i<a.length;i++){a[i]=newInteger(pRand(500));"a["+i+"]="+}}}newInteger[]a=newIntegera[i]=new但若忘記創(chuàng)建對象,就會在運行期試圖空數(shù)組位置時獲得一個“異?!盨tring,它代表著位于對象內(nèi)部的值。1.0允許的唯一形式。第二種(等價)Java1.1182-183//://ArraypublicclassArrayInitpublicstaticvoidmain(String[]args){Integer[]a={newInteger(1),newInteger(2),newInteger[]b=newInteger[]{newInteger(1),newInteger(2),new}}數(shù)組初始化的第二種形式(Java1.1開始支持)提供了一種更簡便的語法,可創(chuàng)建和調(diào)用方法獲得與C變量參數(shù)列表(C通常把它簡稱變參表Object數(shù)組,并象下面這樣調(diào)用它:183//://Usingthearraysyntaxto//variableargumentlists.classA{inti;}publicclassVarArgs{staticvoidf(Object[]x){for(inti=0;i<x.length;i++)}publicstaticvoidmain(String[]args){f(newObject[]{newInteger(47),newnewFloat(3.14),newDouble(11.11)});f(newObject[]{"one","two","three"});f(newObject[]{newA(),newA(),new}}動String轉(zhuǎn)換對每個Object做一些有用的事情。在第11章(運行期類型標(biāo)識或RTTI,4.5.1數(shù)在Java里可以方便地創(chuàng)建數(shù)組184-185//://Creatingmultidimensionalarrays.importjava.util.*;publicclassMultiDimArraystaticRandomrand=newRandom();staticintpRand(intmod){returnMath.abs(rand.nextInt())%mod+}staticvoidprt(Strings){}publicstaticvoidmain(String[]args){int[][]a1={{1,2,3,},{4,5,6,},for(inti=0;i<a1.length;for(intj=0;j<a1[i].length;j++)prt("a1["+i+"]["+j+"]="+//3-Darraywithfixedint[][][]a2=newint[2][2][4];for(inti=0;i<a2.length;i++)for(intj=0;j<a2

溫馨提示

  • 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)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論