面向对象语言基础_第1页
面向对象语言基础_第2页
面向对象语言基础_第3页
面向对象语言基础_第4页
面向对象语言基础_第5页
已阅读5页,还剩59页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

江西师范大学·计算机信息工程学院·计算机科学系《面向对象程序设计》课程组huazhizhang@面向对象程序设计目录第1章程序设计语言概述第2章程序设计语言的基本成分第3章程序设计方法概述第4章面向对象语言基础第5章类的管理及常用工具类第6章异常处理和断言第7章线程第8章GUI编程基础和applet第9章I/O流第10章网络通信第11章泛型与集合框架2/644.1区分类、对象和对象的引用4.2对象的使用4.3类的继承4.4类及其成员的修饰4.5对象的多态4.6抽象类和接口4.7类中的特殊成员第4章面向对象语言基础理解类、对象、对象引用,能从存储管理角度分析相关操作细节;掌握各类修饰的目的;掌握并能应用多态机制;理解抽象类和接口引入的目的和意义。本章重点3/64一个简单的例子对象和对象引用的存储方式对象及其引用的创建和初始化对象的销毁4.1区分类、对象和对象的引用4/644.1区分类、对象和对象的引用classPet{ Stringname; voidshowMe(){ System.out.println("Hi,I'm"+name+"!");}}publicclassCh_4_1{ publicstaticvoidmain(String[]args){ Peta=newPet(); System.out.println("APetobjectiscreated."); ="Snoppy"; a.showMe();}}通过本例了解如下内容:类的定义、使用(即造对象)、对象引用、状态改变、类中成员、对象属性和行为的操控、main、public类和文件名、注意:只能通过引用名来操控对象,不能通过属性值。如、a.showMe()正确,而"Snoppy".name则错误。5/64与类定义有关的注意事项若文件中有public类,则类名必须文件名相同;空类:如:classSpecies{}Java中类是根据类的名字作区分的,而非内容。成员变量可以递归定义。4.1区分类、对象和对象的引用classT1{intx;}classT2{intx;}T1a;T2b;a=b;//编译错classLinkNode{PetString;LinkNodenext;}6/64静态内存分配(基于栈的内存管理模式)即假定函数空间分配在起始地址为0,空间大小为S的内存块上。当函数执行时,把该空间映射到具体的内存空间当函数执行结束后,把该函数登记的标记删除静态内存分配是内存空间自动分配的基础。特色:自动push/pop各函数空间哪些数据接受栈式内存管理在函数中定义的所有变量(基本型或引用型)。4.1.2对象和对象引用的存储方式voidf(){intx;Peta=newPet();Strings="abcd";int[]t={1,2,3};}哪些数据位于栈空间?7/644.1.2对象和对象引用的存储方式publicclassT{ staticvoida(intx){ inty=1;//③ y=b(x,y);//④ } staticintb(intx,inty){ returnx+y;//⑤ } main(String[]args){ intx=5;//① a(x);//② }}栈空间5xnullargsmain5x1y5x1y6resulta(x)b(x,y)8/64基于堆的内存管理模式——手动/动态内存管理堆的含义及特点:各子程序共享的内存空间引入背景和特点:自动管理僵硬,需手动相辅接受堆式内存管理的数据:所有对象空间4.1.2对象和对象引用的存储方式子程序-1子程序-2子程序-3栈空间堆空间堆空间9/64publicclassS{Strings="abc";inti=5;int[]k={1,2,3};

voida(){inti=2;Ssh=newS();sh.b();}

voidb(){charj='p';Ssh=newS();}

main(String[]args){Ssh=newS();sh.a();}}4.1.2对象和对象引用的存储方式栈空间堆空间mainshnullargs5"abc"123sik5"abc"123sik5"abc"123sika()sh2ib()sh'p'j这块内存不能被任何变量/常量直接或间接引用,并一直处于占用状态,系统也无法使用常被称作“内存垃圾”对内存小或24小时不关机系统,如网络服务器、路由器、移动嵌入式系统等,内存泄漏威胁很大。这些恰是Java主要应用领域,因此引入自动垃圾回收机制定期主动回收内存。10/64Java对象的存储示意图4.1.2对象和对象引用的存储方式"abc"//String的方法集……publicfinalclassString堆空间Java方法区String型对象//String的属性集String类的定义因对象功能远比基本型复杂,并需支撑多态、继承、各类修饰,故对象的构造也需适合这些机制的实现。实际更复杂。11/64对象--引用类似人的实体--人名可一人多名。能否多人一名?加前缀,如:java.util.Scanner注:加全部前缀后,不能再有多人一名现象。引用的构造和初始化引用的构造即引用的定义;初始化即首次赋值。4.1.3对象及其引用的创建和初始化int[][]x;Strings1,s2;//引用定义x=null;s1="abc";s2=s1;//初始化int[]y={1,2,3};//构造并初始化12/64对象的构造及初始化new构造函数([参数列表]);

如:Strings=newString("abc");数组、字符串也可特殊构造如:int[]a={1,2,3};Strings="123";4.1.3对象及其引用的创建和初始化13/64构造函数的特点外观:与类同名,无返回值,不能用void声明。若类中未定义任何构造函数,则系统自动提供一个默认的无参构造函数;反之,将不提供。通过new调用,不能通过引用名来调用。其他特色将在后续内容介绍。如借助this、super调用构造函数等4.1.3对象及其引用的创建和初始化classStudent{ privateStringname; privateintage;

publicStudent(Strings,inta){ name=s;age=a; }}14/64普通方法不具备Ch_4_4.java对象的销毁:即回收对象占用的空间。对象销毁前可能需要扫尾工作,如释放该对象相关的资源、关闭文件或数据库连接等。扫尾:重写Object类的finalize()方法注意重写格式,否则是普通方法,扫尾后对象依旧存在。该方法在对象销毁前由垃圾回收器自动调用,何时销毁由垃圾回收器决定。这种情形类似你打电话给环保局要求打扫卫生,他可能响应,更可能不搭理你!4.1.4对象的销毁15/64对象的引用赋值相等判断对象数组从存储管理角度解释参数传递成员变量和局部变量4.2对象的使用16/64对象的引用格式为:对象.成员如:a.length、"abc".length()常量引用引用不可更改,表示指向哪一对象不能更改,指向对象的内容依旧可能会被更改;注意事项空指针异常:引用对象的成员时,对象不存在。引用必须拥有完整的引用路径。4.2对象的使用classSt{Stringname;

intage;}finalSts=newSt();Stt=newSt();="张三";s=t;//编译错111111112222st张三0null02222s的值不可更改s引用对象的成员值可以更改常量引用示例:ch_4_6.java空指针异常示例:ch_4_7.java17/64对象的赋值和引用的赋值如对类E,有以下语句:注意观察内存分配效果4.2对象的使用classE{ intx; Stringy;}1).Ea;2).a=newE();3).a.x=5;a.y="abc";4).Eb=newE();5).a=b;18/64java栈java堆4.2对象的使用?a"abc"1234xnull0y111A1)Ea;2)a=newE();3)a.x=5;a.y="abc";4)Eb=newE();5)a=b;111A?b51234xnull0y21222122212219/64相等判断==:判别地址是否相同equals()直接使用Object类的equals():判别地址是否相同自定义类中重写此方法:更为通用String类的equals()方法就是重写Object类的equals()重新定义equals()(即重载)4.2对象的使用String类equals()的使用:ch_4_8.java自定义类equals()的使用ch_4_9.java关于使用重写和重载方式的细微差别,请在学完4.5节(多态)之后,体会EqualsTest.java20/64java栈java堆对象数组如:String[]sa=newString[10];两点注意:newString[10]不是创建class对象(而是数组对象),因此未调用String的构造函数。sa[0]是String引用,不是String对象。4.2对象的使用ch_4_10.javaclassA{intx=5;}Aa=newA[3];a[0]=newA();51111nullnullnull1100x1100111121/644.2.5从存储管理角度解释参数传递(ch_4_11)4.2对象的使用栈空间堆空间classD{intd;

D(intk){d=k;}}publicclassCh_4_11{

f(intx,inty,Da,Db){

intt;Dd;输出;

t=x;x=y;y=t;

d=a;a=b;b=d;

输出;}main(String[]args){

intx=1,y=2;Da,b;

a=newD(3);

b=newD(4);

输出;

f(x,y,a,b);输出;

}}1xmain11ABa2y1111b1xf()?d11ABa2y1111b41111311AB?t21111AB111111AB从本例看出,无论是基本型还是引用型,在子程序中直接交换均不能影响主程序相关数据的值,要如何做才能影响呢?22/64成员变量和局部变量成员变量:类中定义的变量,在该类/对象中属于全局变量;局部变量:方法中定义的变量,局部于该方法相关注意在Java中,对象的所有成员变量都会被初始,默认值为0、false、null;成员常量只能在定义时或是构造函数中赋值。方法中的局部变量/常量,均不会被自动初始化。4.2对象的使用classStudent{privateStringname;

publicvoidsetName(Strings){intx=5;

name=s;

}}成员变量,在Student中以全局变量形式存在。局部变量,作用仅限于setName()方法。ch_4_5.java、ch_4_12.java23/64继承的语法is-A和has-A关系构造函数的调用顺序super和this4.3类的继承24/64概述功用:子类拥有超类的全部内容。语法:class子类名extends超类名{}概念:继承/派生、超类(基类)/子类(派生类)约束:单继承策略,即子类只能有一个双亲类。4.3类的继承classAnimal{ publicStringname; publicintage; publicvoideat(){;}}classDogextendsAnimal{ publicvoidbark(){;}}25/64关于继承的说明继承是可扩展机制,又可分散类家族的复杂性;如:自然界动植物分类体系子类拥有超类的全部内容,并在此基础上增/改。对超类的私有成员,拥有但不能使用;改:子类新增同名成员遮盖继承自超类的成员。4.3类的继承classAnimal{ publicStringname; publicintage; publicvoideat(){;}}classDogextendsAnimal{

publicdoubleage; publicvoidbark(){;}

publicvoideat(){…}}ch_4_13.java26/64java.lang.Object类是所有类的始祖。主要方法publicbooleanequals(Objectobj)protectedvoidfinalize()throwsThrowablepublicStringtoString()publicfinalnativevoidnotify();……4.3类的继承成员放置在Object类,有何好处,应注意什么?27/64is-A与has-A关系这是对象使用时常考虑的两种关系,不是语法。has-A:有什么,刻画类与其成员之间的关系,主要用于判别成员引用是否合法。is-A:是什么,刻画的是对象与类之间的关系,主要用于判别对象间赋值兼容是否合法。4.3类的继承ch_4_14.javaclassAnimal{ publicStringname; publicintage; publicvoideat(){;}}classDogextendsAnimal{ publicvoidbark(){;}}publicclassCh_4_14{ publicstaticvoidmain(String[]args){ Animal[]a=newDog[2]; a[1]=newDog();a[1].bark(); Animalb=newDog(); b=newAnimal();a[1]=newAnimal(); }}aJava栈Java堆Animal[]a=newDog[2];创建的是Dog[]型数组,即Dog[1]是Dog型。而诸如Dogd=newAnimal();是不符合is-A关系的。Dog型对象Animal型对象28/64构造函数的调用顺序构造对象时,会自动调用该类超类的构造函数,调用次序与派生次序相同。对象创建时隐藏许多内部函数调用。这正是面向对象程序复杂、难调试的典型表现之一。注意若超类有自定义构造函数,则情形是怎样的?若超类有非private的无参构造函数,子类则自动调用;若超类无无参构造函数,则子类构造函数中必须显式调用超类的构造函数,否则编译错。4.3类的继承生物动物狗newDog()时构造函数的调用次序构造函数调用顺序:ch_4_15.java超类无无参构造函数:TestConstructor.java29/64super和this:两个系统提供的实例引用特指"自己"或"父辈"只有当对象存在时才有"自己"和"父亲"使用场合用this/super引用对象自身的成员:this.成员变量或this.成员方法([参数列表])用this/super调用构造函数:(见Person.java)this([参数列表])或super([参数列表])在参数传递或其它应用者特指自己。如窗体自己处理相关事件、医生给自己看病4.3类的继承classA{intx=1,y=2,z=3;}classBextendsA{intx=4;}classCextendsB{intx=5;}newC();zyxxx32145类A成员类B成员类C成员ch_4_16.javathis能引用super能引用classSanJiao{ privatedoublea,b,c,ha,hb,hc; publicSanJiao(doublex,y,z){a=x;b=y;c=z;} publicSanJiao(doublex){ this(x,x,x);}//等边三角}classDoctor{

……publiccure(Personp){ if(p==this)……}}30/64classMyTimplementsRunnable{

Threadt;publicvoidrun(){…}

publicMyT(Stringname){

t=newThread(this,name);

t.start();}把“自己”作为参数传给其它函数。另外,本例是在构造函数中使用this引用,说明此时this已存在。进一步表明构造函数不是用于构造,而是用于“对象构造后的初始化”。访问权限修饰final修饰static修饰4.4类及其成员的修饰31/64访问权限:旨在设定对象内部成员是否可见。public:对外完全公开private:对外完全隐藏。属性常设为私有。缺省、protected:此处暂不介绍注意哪些成员要隐藏,哪些要公开?以电视为例涉及服务标识、简化使用、安全使用、重用等更精细的约束需要用方法来定义。如三角形任意两边之和大于第三边4.4类及其成员的修饰不可见,就不可用。32/64final:最终、不可更改修饰变量:即常量,如finalintPI=3;引入目的:将多处的统一改动集于一次修改最终参数:该参数在方法内不能更改修饰成员方法:方法不能重写引入目的:重写可看作子类对超类方法的改写修饰类:类不能派生引入目的:禁止对类中的所有信息实施更改4.4类及其成员的修饰class帐户{

privateintval;

publicvoid取款(intx){

val=val-x;}}class黑客帐户extends帐户{

privateintval;

publicvoid取款(intx){

val=val+x;}}ch_4_17.java、BankAttack.java33/64static:编译时确定,只能修饰类中的成员。引入背景main方法的调用;需要在一类对象间共享的全局变量,如记录对象数量解决之道:策略:在类中引入特殊成员,隶属于类而非对象实现:借助方法区的类型信息来引用特点:(语法:可通过类名来引用静态成员)静态变量被该类创建的所有对象共享;静态方法直接通过类名引用。4.4类及其成员的修饰34/644.4类及其成员的修饰classT{

static

intx;inty;T(inta,intb){x=a;y=b;}}栈堆方法区staticintx=inty;T(inta,intb)其它方法……classT1abc24635Ta=newT(1,2);Tb=newT(3,4);Tc=newT(5,6);35/64static:编译时确定,只能修饰类中的成员。示例1:ch_4_18.java、ch_4_19.java(简介)注意静态方法与实例方法的相互存取限制,即当使用静态成员时,对象可能不存在,因此不能引用实例成员,除非先构造出对象。示例2:统计/限制学生数量:Student.java4.4类及其成员的修饰36/64设计满足如下要求的三角形类至少有6个成员:三边及三边上的高;构造时必须提供三边或者底和高。之后可补充或重新设置三角形相关属性。要求三角形满足一致性规则:即三条边均正确;未填写则值为0;对非0的属性值,用底*高计算出来的面积与用海伦公式计算出的面积均相同。参考:SanJiao.java课程实验37/64多态的含义重载(overload)重写(override)重定义instanceof与多态性4.5对象的多态38/64多态的含义多态,polymorphism,字面意思是多种形态。在OO方法中,多态即一名多义。同一名字是多态的基础;不同环境是不同含义的前提。何时决定“一名”的具体含义?在编译时决定,即重载;如:狗嗅(主人气味q);嗅(骨头气味q);……在运行时决定,即重写。如:狗d=new藏獒()/new松狮犬();d.咬();4.5对象的多态39/64重载:同名不同参编译时根据参数列表来区分。用途:实现某行为不同环境下的不同表现。特别是构造函数的重载很常见注意不能用参数名称、返回类型等区分重载。4.5对象的多态publicvoidprint(char[])publicvoidprint(char)publicvoidprint(int)publicvoidprint(long)publicvoidprint(double)publicvoidprint(float)publicvoidprint(String)publicvoidprint(Object)System.out.print(……);classDog{publicvoid嗅(主人气味

q){…}

publicvoid嗅(敌人气味

q){…}

publicvoid嗅(骨头气味

q){…}……}方法定义:voidf(doublex,inty){……}voidf(floatx,floaty){……}voidf(Animala){……}方法调用:?f(1.0f,2)、f(1.0,2)、f(1.0,2.0f)、f(newdog)class三角形{

privateinte1,e2,e3,bott,high;三角形(inta,intb,intc){…}三角形(int

b,inth){…}三角形(int

a){…}//等边三角……}40/64重写:父子类同样的行为不同的效果语法:子类方法与超类方法声明形式相同。即同名、同参、同返回类型,方法访问权限不缩小。用途:某名称关联不同对象,产生不同行为。即根据实际对象来决定执行的方法体4.5对象的多态classDog{

publicvoid

bite(){;}}class藏獒

extendsDog{

publicvoidbite(){…}}class泰迪extendsDog{

publicvoidbite(){…}}Dogd=newDog[2];d[0]=new藏獒();d[1]=new泰迪();d[i].bite();41/64关于重写的示例详见例4.7(Ch_4_21.java)功能:智能面积计算器,能自动识别对象的形状,并准确计算该形状的面积,无需if语句。对该示例关键掌握如下问题:类Shape中的area()方法仅仅是返回0,有用吗?矩形等类的area()能否加入参数?加入后有何效果?可扩展性如何体现?(即如何新增可识别的形状)内部是如何关联到具体方法体的?4.5对象的多态42/64关于重写的进一步说明final方法不能被子类重写;static方法不能被重写;重写对继承的影响:设计超类时,应考虑到方法若被重写,将产生何种影响不希望被重写的方法的处理:final/static/private4.5对象的多态43/64重定义:一组与多态相似但不属于多态的情形属于全新的定义,因此没有多态的诸多限制几种常见的重定义形式(了解即可)子类重新定义从超类获得的属性子类定义的方法与超类的私有方法同名;子类定义的方法与超类的静态方法同名;4.5对象的多态classA{publicintx;privatevoidf(){;}publicstaticvoidg(){;}}classBextendsA{privatebooleanx;publicvoidf(){;}publicstaticvoidg(){;}}44/64运算符instanceof含义:判别对象是否是某个引用型的实例。格式:EinstanceofRefType其中,E是引用型表达式;RefType可以是类或接口,且E必须能够自动或强制地转换成RefType,否则编译错。4.5对象的多态Animala=newAnimal();Dogd=newDog();AnimalaDog=newDog();有aDoginstanceofAnimal、

aDoginstanceofDog//均为trueaDoginstanceofCat、

ainstanceofDog//均为falsedinstanceofCat//编译错,因d不能强制地转换成Cat类型nullinstanceofCat//为false,因null不是任何引用型的实例动物中,猴子喝酒,其它喝水。a.drink(wine)非法的。这一需求很难用重写实现(因为参数类型不同)。if(a[i]instanceofMonkey)((Monkey)a[i]).drink(wine);//合法的强制类型转换elsea[i].drink(water);45/64设计一个综合性的形状计算器,可计算周长、面积;计算长方形、正方形、圆形、三角形要求:给出一组不同的形状对象,能正确识别形状,计算周长和面积,显示其它属性信息。课程实验46/64抽象类和接口引入背景抽象方法和抽象类接口4.6抽象类和接口47/64引入背景人们期望在抽象层上更规范地实施程序设计。抽象层:覆盖面广、重用性更强对子类是否重写无约束,重用性无法保证。用抽象方法作为抽象定义和使用的约束。抽象方法:只有规格说明,没有方法体的特殊方法。约束:规定类中有抽象方法不能创建对象。以抽象方法为基础,Java提供了两种抽象机制:抽象类,在父子类之间建立契约;接口,在任意类之间建立契约。4.6抽象类和接口如前面智能面积计算例子中,Circle等类未实现重写形式的area(),合法但无法获得运行期时多态的效果。如:publicabstractdoublearea();抽象方法是一种功能契约。规格说明:约定特定功能的具体名称、输入、输出;无方法体:公平无默认情况,不实现无法造对象,实现必须遵循既定格式。看见类实现了契约就可安全规范地使用契约。48/64抽象方法/类含义:abstract修饰的方法/类,语法要求(违反则编译错)抽象方法不能有方法体;有抽象方法的类必须是抽象类;抽象类不能被实例化(即创建对象)注意事项abstract不能修饰构造方法abstract不能与static、final同时使用4.6.2抽象方法和抽象类abstractclassTest1{ abstractvoidf();//正确 abstractvoidg(){;}//编译错 voidh();//编译错}【思考】抽象类是否有构造函数?若有,因抽象类不能创建对象,构造函数又有何用?设计测试用例验证之。提示:从构造函数的作用角度考虑问题。用抽象类方式实现智能面积计算器ch_4_24.java49/64抽象类的用途:半成品模型非成品部分:即抽象方法,需要扩展之处;成品部分:其他,可直接使用。半成品模型是一个高度可重用的使用框架用于快速构造不同成品模型,且构造方式规范,即有共同的基础和约定。这将增强类的重用性、易用性和可理解性。4.6.2抽象方法和抽象类如联想昭阳==》K47==》K47系列联想官方为何如此?50/64背景:单继承让抽象类方式契约使用代价高。接口:由常量和抽象方法组成的契约。语法约束:变量默认:publicstaticfinal,且不可更改方法默认:publicabstract,且不可更改接口不是类无构造函数,不能实例化,支持多继承。4.6.3接口[修饰符]interface接口名[extends父接口列表]{[public][static][final]类型成员常量=常量值;[public][abstract]返回类型成员方法名([参数列表]);}interfaceTest1{intx=0;

//正确,修饰?voidf();//正确,修饰?inty;

//编译错protectedinty;//编译错privatevoidh();//编译错voidg(){;}

//编译错}interfaceTest2{inty=2;}interfaceTest3extendsTese1,Test2{intz=5;}接口不能创建对象,有何作用,又如何使用呢?51/64接口与类的关系:类实现接口(中的抽象方法)。class类名implements接口列表{类体定义;}注意,接口中抽象方法的权限接口与实现类之间,可赋值兼容。如手机、相机实现USB接口,USBu=new手机()/相机();

4.6.3接口interfaceA{ voidf();}interfaceB{ voidg();}abstractclassTimplementsA,B{ intx; privatevoidf(){;} //编译错}用接口方式实现智能面积计算器ch_4_26.java52/64接口是能力标签,拥有接口就拥有某种能力借助接口可刻画不同类之间的共性,实现不同类对象间的运行时多态。例如USB

u=new手机()/new电视机()/……类通过实现多个接口来替代多继承,使得抽象设计层次更高、设计更安全、更规范。继承除子类重用超类信息外,还为运行时多态奠定基础。实现多个接口可实现多类运行时多态;如

蓝牙a=new手机();a.蓝牙传输();红外类似……接口抽象层次高、与具体类无关、设计更公平4.6.3接口53/64接口是能力标签,拥有接口就拥有某种能力借助接口,可实现不同类对象之间的耦合。如:PC-USB-Printer接口体现了设计与实现分离的思想。接口设计者:接口中应包含哪些共性内容才够用,不考虑如何实现;接口实现者:根据需要选取接口,使用接口的目的是为了易于日后通用。要展现自己的特色。好处:接口不变,实现改变不影响使用。4.6.3接口PCimplementsUSB{………send(USB目标){...};…receive(USB源){...};}PrinterimplementsUSB{………send(USB目标){;};…receive(USB源){...};}interfaceUSB{…send(USB目标);…receive(USB源);}实现PC–USB–Printerpc=newPC();pr=newPrinter();pc.send(pr);54/64接口多继承机制存在的问题菱形继承接口冲突现象4.6.3接口classA{intx;}classB{charx;}classC{

floatx;}classD{;}x的类型?interfaceA{intx=10;}interfaceB{doublex=2;}interfaceCextendsA,B{;}classDimplementsC{;}上述代码虽编译正确,但加入下面代码后将引发编译错:Dd=newD();System.out.println(d.x);//编译错55/64游戏类框架设计(参见GameFrame.java)某游戏中有轰炸机、直升机、重型坦克、轻型坦克、飞行兵、步兵等六大兵种,下面设计一组类和接口,满足如下设计要求:轰炸机、直升机均属于飞行器这一大类;重型坦克、轻型坦克均属于坦克这一大类;飞行兵、步兵均属于人这一大类;重型坦克、轻型坦克、步兵均属于陆军;轰炸机

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论