




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
4始化和清“初始化”和“清除”是這些安全問題的其中兩個。許多C程序的錯誤都是用的資源會一直保留下去,極易產生資源(主要是內存)用盡的。建之后自動調用。Java也沿用了這個概念,但新增了自己的“收集器,能Java如何提供它們的支持。用構建器自動初始initialize()用的任何名字都可能與打算為某個類成員使用的名字第二是由于編譯器的Java里得到了應用:構建器的名字與類名相同。這樣一來,可保證象這樣的一個方在初始化期間自動調用。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有一個構建器,它用一個整數自變量標記樹的高度,那么Tree對象:treetnewTree(12);12英尺高的Tree對象。initialize()方法的明確調用——那些方法在概念上獨立于定義內容。在Java中,定義和初始化屬于統一的概念——兩者。void方法過我們用名字或描述所有對象與方法。若名字選得好,可使自己及其他人(prin()顯示浮點數——每個函數都要求具備唯一的名字。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()方法。例如,假設我們有一條額區分過載方方法,因為它會產生難以的代碼: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值處理。所以假我們的數據類“小于方法中使用的自變量就會對那種數據類型進“”配,就會為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();}}大家可注意到這是一“縮小轉換也就是說在造型或過程中可能丟返回值過voidf()intf()若編譯器可根據上下文(語境)intx=f()中,那么Javaf()的具體調用方式呢?而且別人如何識別并理解代碼呢?由默認構建158//:classBird{inti;}publicclassDefaultConstructorpublicstaticvoidmain(String[]args){Birdnc=newBird();//default!}}newclassBush{Bush(inti){}Bush(doubled){}}newthis關鍵f()方法:classBanana{voidf(inti){/*...*/}}Bananaa=newBanana(),b=newBanana();若只有一個名叫f()的方法它怎樣才能知道自己是為a還是為b調用的呢?編譯器為我們完成了一些幕后工作。其中的就是第一個自變量傳遞給方法的關鍵字:this。this關鍵字(注意只能在方法)可為已調用了其方法thisthis句柄會自動應用于其他方法。classApricotvoidpick(){/*...*/voidpit(){pick();/*...*/}在pit()內部,我們可以說this.pick(),但事實上無此必要。編譯器能幫我們自return語句中使用。160//://Simpleuseofthe"this"publicclassLeaf{inti=0;Leafincrement(){return}voidprint(){System.out.println("i="+i);}publicstaticvoidmain(String[]args){Leafx=newLeaf();}}increment()通過this關鍵字返回當前對象的句柄,所以可以方便地對同在構建器里調用構建this關鍵字做到這一點。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的名字以及成員數據s的名字是相同的,所以會出現。為解決這個問題,可用this.s來Java代碼里看到這種形式的應用,本書的大量地方也采static的含理解了this關鍵字后,我們可更完整地理解static(靜態)方法的含義。它意味著一個特定的方法沒有this們不可從一個static方法內部發出對非static方注釋②staticstatic方法最局函數不允許在Java中使用以外,若將一個static方法置入一個類的內部,它就可以其他static方法以及static字段。②:有可能發出這類調用的一種情況是一個對象句柄傳到static方法內部。隨后,通過句柄(此時實際是this,我們可調用非static方法,并非static方法并不是“面向對象”的,因為它們具有全局函數的某staticthis。這己的策略。然而,static的概念是非常實用的,許多時候都需要用到它。所以至static的東西。清除:收尾和收。int呢?但是對于庫來說,用完后簡單地“釋放”一個對象并非總是安全的。當然,Java可用收集器回收由不再使用的對象占據的內存。現在域,沒有使用new收集器只知道釋放那些由new分配的內存,所以不知道如何釋放對象的“特殊”內存。為解決這個問題,Javafinalize()旦收集器準備好釋放對象占用的空間,它首先調用finalize(),而且只有在下一次收集過程中,才會真正回收對象的內存。所以如果使用finalize(),就可以在收集期間進行一些重要的清除或清掃工作。。但也是一個潛在的編程陷阱,因為有些程序員(特別是在C++開發背景的剛開始可能會錯誤認為它就是在C++中為壞器”(Destructor)使用的C++JavaC++的對象肯定會被清除(排開編程錯誤的因素,而Java對象并非肯定能作為被“收集”去。或者換句話說:收集并不等于“破壞Java并未提供“破壞器”或者類似的概念,所以必須創建一個原始的方法,用它果不從屏幕明確刪除它的圖像,那么它可能都不會被清除。若在finalize()里置入某種刪除機制,那么假設對象被當作收掉了,圖像首先會將自身從屏幕我們的對象可能不會當作被收掉有時可能發現一個對象的空間都不會釋放,因為自己的程序都接近于用光空間的臨界點。若程序執行結束,而且收集器一直都沒有釋放我們創建的任何對象的空間則隨著程序的退出那些資源會返回給操作系統。這是一件好事情,因為收集本身也要消耗一些開銷。如都不用它,那么finalize()用途何也就是說收集器存在的唯一原因是為了回收程序不再使用的內存以對于與收集有關的任何活動來說其中最值得注意的是finlie()方法們也必須同內存以及它的回收有關。但這是否意味著假如對象包含了其他對象,finalie()就應該明確釋放那些對象呢?答案是否定的——收集器會負責釋放所有對象占據的內存無論這些finlie()我們的對象可采用與創建對象時不同的方法分配一些空間但大家或許會注意到,a中的所有東西都是對象,所以這到底是怎么一回事呢?finliz()a的法,通過分配內存來做一些具有C風格的事情。這主要可以通“固有方法”來進行,它是從a里調用非a方法的式(固有方法的A討論CC++代碼內部也許能調用C的malloc()系列數用它分配空間而且除非用了(),否則空間不會得到釋放,從而造成內存“”的出現。當然,()CC++finalize()內部的一個固有方法中調finliz()應在何處進行呢?必須執行清C++“C++C++對象創建成一個本地對象,比如在堆棧中創建(Java中是不可能的new創建的(JavaC++的delete命令時(Java沒有這個命令那么不會調用破壞器,我們最終得到的將是一個內存“,另外還包括對象的其他部分不會得到清除。相反,Java不允許我們創建本地(局部)new。但在Java中,沒有“delete”命令來釋放對象,因為收集器會幫助我們自動釋放空間。所以如果站在比較簡化的立場,我們可以說正是由于存在收集制的需要(而且絕對不能直接調用finalize(),所以應盡量避免用它。若希望執行除釋放空間之外的其他某種形式的清除工作,仍然必須調用Java中的一C++的破壞器,只是沒后者方便。finalize()最有用處的地方之一是觀察收集的過程。下面這個例子向大家展示了收集所經歷的過程,并對前面的陳述進行了總結。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")){}}}}上面這個程序創建了許多Chair對象,而且在收集器開始運行后的某些時候,程序會停止創建Chair。由于收集器可能在任何時間運行,所以我們生成。這兩個標記都是在finalize()內部設置的,它調用于收集期間。另兩個static變量——created以及finalized——分別用于已創建的對象己的(非static)inti,所以能了解它具體的編號是多少。編號為47的ChairtrueChair對象的創建過程。newChair();newString("Totakeup}finlize()47尾處理。每次循環過程中創建的String對象只是屬于額外的,用于吸引收集器——一旦收集器對可用內存的容量感到“緊張不安,就會開始關注它。“before”自變量會調用System.gc()方法(強制執行收集器,同時還會調用System.runFinalization()Java1.0中方法卻只有這個方法,而且收尾程序的執行與收集器是否運行是無關的。③不幸的是a1.0采用的收集器方案不能正確地調用finalie()。finlize()特別是那些用于關閉文件的事實上經常都不會得到調用。現在有些文章聲稱所有收尾模塊都會在程序退出的時候得到調用——即使到程序中止的時候,收集器仍未針對那些對象采取行動。這并不是真實的情況,finalize(能為所有對象而調用。特別地,fialie()va1.0Java1.1中,收尾模塊肯定會運行這一許諾已如“none”Created167-168Beginningtofinalizeafter3486ChairshavebeencreatedFinalizingChair#47,SettingflagtostopChaircreationAfterallChairshavebeencreated:totalcreated=3881,totalfinalized=2684System.gc()System.runFinalization()清除到目前為止沒有使用的所有對象。這樣做一個稍顯奇怪的地方是在調用runFinalization()gc()Sun公司的文檔說明有些抵觸,它宣稱首先運行收尾模塊,再釋放空間。然而,若在這里首先調用runFinalization()gc(),收尾模塊根本不會執行。//://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虛擬機(JVM)可能已開始表現出不同的行針對所有對象,Java1.1有時之所以會默認為跳過收尾工作,是由于它認為成員初始voidf(){inti;}為i賦予一個默認值但它看起來更象一個程序員的此時默認值反而“幫而,若為其賦予一個值,同樣是非常不安全的。因此,一個類的所有基本類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規定初始(C++里不能這C++的新手們總“想”這樣做。在下面,Measurement類內部的字段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();}這正是編譯器對“向前”感到不適應的一個地方,因為它與初始化的順構建器初始classCounter{inti;Counter(){i=7;//..i7。對于所有基本類型以及對象句柄,進行初始化,而且它對于對象來說是強制進行的。參見《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一個對象會被丟棄,所以它后來可被當作收掉。從表面看,這樣做似乎效t3t3靜態數據的初始(static(NULL到何時對那個區域進行初始化的問題下面這個例子可將這個問題說更清楚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能創建散布于類定義中的Bowlstatic注意在static定義之前,Cupboard先創建了一個static的Bowlb3。它的輸出結果如下:175CreatingnewCupboard()inmainCreatingnewCupboard()inmain都不Table.b1或Table.b2,那么staticBowlb1和b2都不會創建們才會創建。在那以后,static初始化的順序是首先static(如果它們尚未由前一次對象創建過程初始化,接著是非static對象。大家可從輸出結果中找到相應的。DogDogDogstatic方法/static字段首次時,Java解釋器必須找到Dog.class(在事先設好的類路徑里搜索。找到Dog.class后(它會創建一個Class對象,這將在后面學到它的所為一個Dog對象分配足夠多的空間。這種空間會清為零將Dog中的所有基本類型設為它們的默認(零booleanchar的等價設定。6章將要講到的那樣,這實際可能要求進行相當多明確進行的靜態初始()176頁下程序classSpoon{staticinti;statici=}//..static關鍵字,后面跟隨一個方法個對象時,或者首次屬于那個類的一個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 //}在標記為(1)的行內static對象c1的時候,或在行(1)標記為注釋,同時(2)行不標記成注釋的時候,用于Cups的static初始化模塊就會運行。若(1)和(2)都被標記成注釋,則用于Cups的static初始化進程不會發生。非靜態實例的初始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}它看起來與靜態初始化從句極其相似,只是static關鍵字從里面了。為支持對“內部類”的初始化(參見第7章,必須采用這一語法格式。數組初始更安全(注釋⑥。Java則沒有象C++那樣的“集合”概念,因為Java中的所有([]int[]int還是前一種語法,因為它類型是“一個int數組。本書將沿用那種格式。任何空間。為了給數組創建相應的空間,必須編寫一個初始化表達式。對于起來的值。空間的分配(等價于使用new)將由編譯器在這種情況下進行。int[]a1={1,2,3,4,5int[]Javaa2=我們真正準備做的是一個句柄,就象下面演示的那樣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數組從元素0開始計數,所以能索引的最大元素編號是“length-1”。如超出邊界,C和C++會運行期錯誤(即一個“異常這是第9章的。當然,由于需要檢查每個數意味著數組可能成為程序效率低下的重要原因——如果它們在關鍵的場合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但若忘記創建對象,就會在運行期試圖空數組位置時獲得一個“異常”String,它代表著位于對象內部的值。1.0允許的唯一形式。第二種(等價)Java1.1182-183//://ArraypublicclassArrayInitpublicstaticvoidmain(String[]args){Integer[]a={newInteger(1),newInteger(2),newInteger[]b=newInteger[]{newInteger(1),newInteger(2),new}}數組初始化的第二種形式(Java1.1開始支持)提供了一種更簡便的語法,可創建和調用方法獲得與C變量參數列表(C通常把它簡稱變參表Object數組,并象下面這樣調用它: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轉換對每個Object做一些有用的事情。在第11章(運行期類型標識或RTTI,4.5.1數在Java里可以方便地創建數組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. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 植物護養知識培訓課件
- 凍貨收購合同范本
- 裝修工程總價合同
- 店鋪營業轉讓合同范本
- 絹花加工購銷合同范本
- 磚地面施工合同范本
- 賣汽車抵押合同范本
- 飯店購銷合同范本簡單
- 烘焙開店合同范本模板
- 買賣工廠廢料合同范例范例
- YY/T 0811-2021外科植入物用大劑量輻射交聯超高分子量聚乙烯制品
- HY/T 187.4-2020海水循環冷卻系統設計規范第4部分:材料選用及防腐設計導則
- GB/T 20910-2007熱水系統用溫度壓力安全閥
- 市政綠化工程施工監理要點
- 特種設備作業人員資格復審申請表
- 某隧道仰拱棧橋施工方案
- 第七章--展示的版面和色彩設計
- DBT29-295-2021 600MPa級高強鋼筋混凝土結構技術標準
- 手衛生知識培訓PPT課件下載
- 1#主變投運方案
- (完整版)六宮格數獨100題
評論
0/150
提交評論