版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 烟台理工学院《交际韩语》2022-2023学年第一学期期末试卷
- 烟台大学《算法与数据结构》2021-2022学年第一学期期末试卷
- 创客教育在秋季的实施方案计划
- 许昌学院《环境色彩设计》2022-2023学年第一学期期末试卷
- 二年级数学计算题专项练习1000题汇编
- 互动式阅读与书籍推广活动计划
- 提升公司财务管理效率的方法计划
- 电商物流分拣协议三篇
- 校内外实习与见习安排计划
- 道德教育与社会实践相结合计划
- 框架结构-多层框架结构布置
- 尿毒症预防科普
- 直播翡翠行业现状分析
- 预防小火亡人主题班会
- 小学语文教学中的跨学科融合
- 唐山市大学生女子篮球活动开展现状的调查研究开题报告
- 中药材种植可行性研究报告三篇
- 肛瘘LIFT术式介绍
- 通过《古文观止》选读了解古代文学的社会功能与价值
- GB/T 43575-2023区块链和分布式记账技术系统测试规范
- 幼儿园儿歌教学PPT优质课件
评论
0/150
提交评论