第4章 面向对象编程_第1页
第4章 面向对象编程_第2页
第4章 面向对象编程_第3页
第4章 面向对象编程_第4页
第4章 面向对象编程_第5页
已阅读5页,还剩86页未读 继续免费阅读

下载本文档

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

文档简介

第4章面向对象编程主要任务:

理解面向对象编程的基本概念了解类的封装方法如何创建类和对象了解成员变量和成员方法的特性学习使用OOP方式进行程序设计本章主要内容1.面向对象基本概念2.Java的类与对象3.成员变量与访问权限4.成员方法Java第4章讲课纲要1、对象的基本概念,信息世界对象的表达方式与现实世界对象的表达方式的对应关系(参见P57或H6)。2、类的基本概念,现实世界中有很多同类对象(参见P58)。3、封装的含义,所起的作用(P58)4、消息传递机制,对象之间进行交互的主要方式(P58)。5、继承(第5章H5)(P59,H10)6、接口是弥补不支持多重继承而采用的一项措施。(P59)Java第4章讲课纲要7、类是Java程序的核心与基础,对象是类的实例(参见P62或H16)。8、创建类时要用到的一组关键字。(P62-64)(H18-27)。9、new运行符与Java对象创建方法,Java的垃圾回收机制(P66,P68)(H35)(H42)10、成员变量的声明与访问限制(参见P69例4.4,表4.1)(H46)11、成员方法的声明(P75)4.1面向对象基本概念Java是完全面向对象编程语言。面向对象编程(OOP)是一种全新的编程理念。什么是对象?类又是什么?它们之间有什么关系?对象是如何通过消息和外部通讯的?下面的内容就讨论这些问题。4.1.1对象在开发软件的信息世界中,对象定义为相关数据和方法的集合。对象是现实世界对象的抽象模型。从现实世界对象中抽象出来的对象,一般通过变量描述其状态,通过方法实现其行为。变量是一种有名称的数据实体,而方法则是和对象相关的函数或过程。4.1.2类类就是对象的软件图纸、模板或原型,它定义了同类对象共有的变量和方法。类和对象二者不太容易区分。一方面,由于软件对象都是现实对象或抽象概念的电子模型,另一方面,经常不加区分地将对象和类统称为“对象”。Java编程就是设计类,可以采用自定义方法或继承方法设计一个类,然后使用它的实例对象完成具体的功能。4.1.3封装封装的含义是把类设计成一个黑箱,使用者只能看见类中定义的公共方法,而看不到方法实现的细节,也不能直接对类的数据进行操作,迫使用户通过接口去访问数据。相关数据和方法封装到一个包里,为程序员带来了两个好处:模块化和数据隐藏。

4.1.4消息对象的行为由方法来实现,消息传递是对象之间进行交互的主要方式。构成消息的三个要素是:☆接收消息的对象☆接收消息后进行处理的方法☆方法所需要的参数4.1.5继承继承(inheritance)不但可以发生在同一个层次上,也可以发生在不同层次上。所有层次的类都是从Object类那里直接或间接地衍生下来的。一般来说,层次越高,类就越抽象,反之类就越具体。继承使父类的代码得到重用,在继承父类提供的共同特性基础上添加新的代码,有效提高了编程效率。4.1.6接口接口(interface)可以看成是为两个不相关的实体提供交流途径的设备。在Java中,接口就是为两个不相关的类提供交流的设备。接口非常类似于协议(protocol一种共同行为的约定),是一个包含方法定义和常量值的集合。接口不需要建立继承关系,就可以使两个不相关的类进行交互。接口提取了类的某些共同点,声明一些能被多个类实现的方法,但不给出方法体。例4.1设计一个Applet小程序,使其可以进行简单的加法运算。//源程序名:Addition.javaimportjava.awt.*;importjava.awt.event.*;importjava.applet.Applet;publicclassAdditionextendsAppletimplementsActionListener{Labellabel1=newLabel("+");Labellabel2=newLabel("=");TextFieldfield1=newTextField(6);TextFieldfield2=newTextField(6);TextFieldfield3=newTextField(6);Buttonbutton1=newButton("相加");

publicvoidinit(){//初始化

add(field1);add(label1);add(field2);add(label2);add(field3);add(button1);button1.addActionListener(this);}

publicvoidactionPerformed(ActionEvente){//处理按钮事件

intx=Integer.parseInt(field1.getText())+Integer.parseInt(field2.getText());field3.setText(Integer.toString(x));//数值转换为字符串

}}4.2Java的类与对象Java程序的所有数据类型都是用类来实现的,Java语言是建立在类这个逻辑结构之上,所以Java是一种完全面向对象的程序设计语言。类是Java的核心,Java程序都由类组成,一个程序至少要包含一个类,也可以包含多个类。对象是类的实例,Java程序中可以使用标识符表示对象,并通过对象引用类中的变量和方法。4.2.1类的创建类通过关键字class来创建,下面的声明语句格式给出了可能出现的符号和顺序:

[public][abstract][final]<class><类名>[extends父类][implements接口]{<类体(成员变量和成员方法)>}

其中,[]表示为可选项,<>表示为必选项。关键字含义说明如下:1.class类名class关键字告诉编译器这是一个类,类名是可以自由选取但必须是合法的标识符。在声明类的语句中,class前面的关键字称为类的修饰符。2.访问限制修饰词(1)public(公共的)带有public修饰符的类,称为公共类,是访问限制最宽的修饰词,公共类可以被任何包中的类使用。注意:在同一个源程序文件中只能有一个public类。(2)private(私有的)带有private修饰符的类,称为私有类,是访问限制最窄的修饰词,只能被该类的对象访问,其子类不能访问,更不能跨包访问。(3)protect(保护的)带有protect修饰符的类,称为保护类,能被该类的对象与子类访问,即使子类在不同包中也可以。(4)default(默认的)带有default修饰符的类,称为默认类,与没有任何修饰符相同,默认情况下,类只能被同一个包中的其他类访问。3.Abstract(抽象的)有时,定义的类代表了一个抽象的概念,就不能用它来实例化一个对象。同样在OOP中,可能建立了一个不需要产生对象的类。例如,java.lang包中的Number类代表了数这个抽象概念,可以用它在程序中产生一个数的子类,如Interger或Float,但从Number中直接生成对象是没有意义的。abstract说明的类称为抽象类,不能用它实例化一个对象,它只能被继承。4.final(最终的)final说明的类称为最终类。一个最终类不可能有子类,也就是说它不能被继承。黑客常用的一个攻击技术是设计一个子类,然后用它替换原来的父类。子类和父类很相象,但做的事情却大不一样。5.Extends(继承)父类名extends告诉编译器创建的类是从父类继承下来的子类,父类必须是Java系统类或已经定义的类。从父类继承,可以提高代码的重用性,不必从头开始设计程序。大部分情况下应该利用继承的手段编程,只在没有合适的类可以继承时才自己设计类。6.Implements(实现)接口名implements告诉编译器类实现的接口,接口必须有定义,一般为系统类。接口是消息传递的通道,通过接口,消息才能传递到处理方法中进行处理。implements说明你的类可以实现的一个或多个接口,如果有多个接口,要用逗号分隔。例4.2下面这个Applet程序将在页面上输出两个矩形,并伴有文字输出。见图:程序代码:importjava.awt.*;importjava.applet.Applet;publicclassClass1extendsApplet{privateintx,y,width,height;

publicvoidinit(){width=60;height=60;}

publicvoidsetPosition(intxPos,intyPos){x=xPos;y=yPos;}publicvoidpaint(Graphicsg){setPosition(20,20);g.drawRect(x,y,width,height);g.drawString("矩形1的X位置:"+x,20,100);g.drawString("矩形1的Y位置:"+y,20,120);

setPosition(170,20);g.drawRect(x,y,width,height);g.drawString("矩形2的X位置:"+x,170,100);g.drawString("矩形2的Y位置:"+y,170,120);}}4.2.2创建对象类是对象的产品模板。在现实世界里,我们使用的是产品而不是产品的图纸。同样道理,Java运行的应该是用类创建的实例化对象。一个典型的Java程序会创建很多对象,它们通过消息传递进行相互交流,共同完成程序的功能。一旦任务完成,对象就会被垃圾收集器收回,完成它从创建、使用到清除的生命三步曲。下面介绍对象的创建过程。先看一个例子。例4.3下面这个程序是改写后的例4.2。importjava.awt.*;importjava.applet.Applet;publicclassClass2extendsApplet{MyBoxb1=newMyBox();MyBoxb2=newMyBox(170,20,60,60);publicvoidpaint(Graphicsg){b1.setPosition(20,20);b1.setSize(60,60);b1.draw(g);g.drawString("矩形1的X位置:"+b1.getX(),20,100);g.drawString("矩形1的Y位置:"+b1.getY(),20,120);b2.draw(g);g.drawString("矩形2的X位置:"+b2.getX(),b2.getX(),b2.getY()+80);g.drawString("矩形2的Y位置:"+b2.getY(),b2.getX(),b2.getY()+100);}}程序代码:classMyBox{privateintx,y,width,height;MyBox(){x=0;y=0;width=0;height=0;}

MyBox(intxPos,intyPos,intw,inth){x=xPos;y=yPos;width=w;height=h;}publicvoidsetPosition(intxPos,intyPos){x=xPos;y=yPos;}

publicvoidsetSize(intw,inth){width=w;height=h;}publicintgetX(){returnx;}

publicintgetY(){returny;}publicvoiddraw(Graphicsg){g.drawRect(x,y,width,height);}}下面给出创建对象和使用对象的方法说明1.创建对象与构造方法首先必须拥有一个合适的类才能创建一个合适的对象,有了合适的对象才能完成合适的工作。下面的三条语句分别创建了三个对象:

Lablelabel1=newLabel("标签");TextFieldfield1=newTextField(10);MyBoxb1=newMyBox(20,20,100,100);创建对象语句

创建对象语句有三个组成部分:声明对象、实例化、初始化。格式为:

<类名><对象名>=new<类名>([参数列表])创建对象

创建对象相当于定义一个变量,既可采用上述方法,也可以把上述步骤分开进行,先声明对象,再实例化对象,进行初始化。(1)声明对象

<类名><对象名>

如:MyBoxb2(2)实例化和初始化

<对象名>=new<类名>([参数列表])如,MyBoxb2=newMyBox(20,20,100,100);2.对象初始化的说明(1)系统如何对变量初始化变量声明后没有赋值,在使用变量时会出现错误。当用new创建了一个对象时,系统会为对象中的变量进行初始化。(2)构造方法的作用与构成

new操作符为对象分配内存后将调用类的构造方法确定对象的初始状态,初始化所有变量。也就是说,对象的初始化任务要靠构造方法来完成。例4.3中定义的两个构造方法:MyBox(){x=0;y=0;width=0;height=0;}MyBox(intxPos,intyPos,intWidth,intHeight){x=xPos;y=yPos;width=Width;height=Height;}构造方法比较第一个是缺省的构造方法MyBox(),没有任何参数,它把MyBox类的4个成员变量赋值为0。第二个构造方法MyBox(int,int,int,int)有4个参数,创建对象时可以传递4个参数给MyBox类赋初值。MyBox()和MyBox(int,int,int,int)同为类MyBox的构造方法,方法名相同而参数不同,这是类的多态性的体现。3.对象的使用创建对象时,一个对象的所有变量和方法代码(包含对象的类的变量和方法)都被读到专为它开辟的内存区域中。为了让解释器知道代码的内存地址,使用对象的任何成员时都要加上引用。即在变量和方法的前面加上对象名,并用圆点分隔。格式为:

<对象名>.<变量名><对象名>.<方法名>4.清除对象使用new操作符创建对象后,Java虚拟机自动为该对象分配内存并保持跟踪。Java虚拟机对不再被引用的对象释放其占用的内存。这种定期寻找不再使用的对象并自动释放对象占用内存的过程称为垃圾收集。Java虚拟机实际上是利用变量生存期来管理内存的,对象的引用被保存在变量中,当程序跳出变量所在的区域后,它就会被自动清除。OOP的基本思想OOP的基本思想:抽象、封装、继承等。封装是抽象的具体实现。封装就是用操作方法把数据封闭到类中,形成以数据为核心,以方法为外壳的类。封装能保护类的数据免受外界的更改。封装的结果是形成了独立的和完整的程序模块。4.3成员变量与访问权限成员变量描述了类和对象的状态,有时也称为属性、数据、域(field)。对成员变量的操作实际上就是改变类和对象的状态,使之能满足程序的需要。与类相似,成员变量也有很多修饰符,用来控制对成员变量的访问,实现对类和对象的封装。4.3.1成员变量的声明例4.4显示当前日期和时间,运行结果见图:importjava.awt.Graphics;importjava.applet.Applet;importjava.util.Calendar;classTime{privateCalendart;privateinty,m,d,hh,mm,ss;程序代码:

Time(){t=Calendar.getInstance();y=t.get(t.YEAR);m=t.get(t.MONTH)+1;d=t.get(t.DATE);hh=t.get(t.HOUR_OF_DAY);mm=t.get(t.MINUTE);ss=t.get(t.SECOND);}publicStringgetDate(){returny+"年"+m+"月"+d+"日";}publicStringgetTime(){Strings=hh+"时"+mm+"分"+ss+"秒";returns;}}publicclassShowTimeextendsApplet{Timet=newTime();publicvoidpaint(Graphicsg){g.drawString("当前日期:"+t.getDate(),50,40);g.drawString("当前时间:"+t.getTime(),50,80);}}4.3.2成员变量的修饰成员变量的声明语句有如下格式:

[public][private][protected][package]//访问控制修饰符

[static][final][transient][volatile]<数据类型><成员变量名称>1.访问控制权限(1)public公共变量由public修饰的变量称为公共变量,只有在确认任何外部访问都不会带来不良后果的情况下才将成员声明为公共的。公共变量没有秘密可言,不具有数据保护功能。(2)private私有变量由private修饰的变量称为私有变量,只能被声明它的类所使用,拒绝任何外部类的访问。私有变量是不公开的是对类进行封装时使用的主要方法。(3)protected受保护变量由protected修饰的变量称为受保护变量,可被声明它的类和派生的子类以及同一个包中的类访问。(4)package包变量由package修饰的变量称为包变量,在声明时常常省略package关键字。包成员可被声明它的类和同一个包中的其它类(包括派生子类)所访问,在其它包中的子类则不能访问父类的包成员。2.static静态变量static声明的成员变量被视为类的成员变量,而不把它当作实例对象的成员变量。换句话说,静态变量是类固有的,可以直接引用,其它成员变量仅仅被声明,生成实例对象后才存在,才可以被引用。基于这样的事实,也把静态变量称为类变量,非静态变量称为实例变量。相应地,静态方法称为类方法,非静态方法称为实例方法。例4.5静态变量的使用。classStaticDemo{staticintx;inty;staticpublicintgetX(){returnx;}staticpublicvoidsetX(intnewX){x=newX;}程序代码:

publicintgetY(){returny;}publicvoidsetY(intnewY){y=newY;}}publicclassShowDemo{publicstaticvoidmain(String[]args){System.out.println("静态变量x="+StaticDemo.getX());System.out.println("实例变量y="+StaticDemo.getY());//非法,编译时将出错

StaticDemoa=newStaticDemo();StaticDemob=newStaticDemo();

a.setX(1);a.setY(2);b.setX(3);b.setY(4);System.out.println("静态变量a.x="+a.getX());System.out.println("实例变量a.y="+a.getY());System.out.println("静态变量b.x="+b.getX());System.out.println("实例变量b.y="+b.getY());}}对上面的源程序进行编译会出现如图所示结果,不能进行运行该程序。运行结果显示:将源程序中的出错语句删除或使用解释符//隐藏起来如:

//System.out.println(“实例变量y=”+StaticDemo.getY());//非法,编译时将出错,再进行编译,即可执行该程序,结果如图所示。从输出结果中可以得出以下几点结论:类的静态变量可以直接引用,例如在程序中直接使用了StaticDemo.getX(),而非静态变量则不行。类的静态变量相当于某些程序语言的全局变量。静态方法只能使用静态变量,不能使用实例变量。类的静态变量只有一个版本,所有实例对象引用的都是同一个版本。对象实例化后,每个实例变量都被制作了一个副本,它们之间互不影响。3.final最终变量一旦成员变量被声明为final,在程序运行中将不能被改变。这样的成员变量就是一个常量。例如:

finaldoublePI=3.14159;该语句声明一个常量PI,如果在后面试图重新对它赋值,将产生编译错误。另外,常量名一般用大写字母。常量和直接量一样不占用内存空间。4.transient过渡变量Java语言目前对transient修饰符没有明确说明,它一般用在对象序列化(objectserialization)上,说明成员变量不许被序列化。5.volatile易失变量volatile声明的成员变量为易失变量,用来防止编译器对该成员进行某种优化。这是Java语言的高级特性,仅被少数程序员使用。4.4成员方法对象的行为由类的方法实现,其它对象可以调用一个对象的方法,通过消息的传递实现对该对象行为的控制。下面讨论如何通过方法影响对象的行为。4.4.1成员方法的设计类的设计集中体现在成员方法的设计上。良好的设计可以使类更加强壮,功能更加完善。成员方法的设计应该从类的整体行为出发,能正确响应外部消息,自然地改变对象的状态,并符合相对独立性、结构清晰、可重用性强等编程要求。来看下面的例子:例4.6方法对对象行为的影响,运行结果见图:importjava.awt.*;importjava.applet.Applet;classDrawShape{privateintx,y,shape;publicvoidsetPos(intxPos,intyPos){x=xPos;y=yPos;}程序代码:

publicvoidsetShape(intchoice){shape=choice;}publicvoiddraw(Graphicsg){if(shape==1)g.drawRect(x,y,60,60);elseif(shape==2)g.drawOval(x,y,60,60);elseg.drawString("形状参数不对!",20,120);}}publicclassM1extendsApplet{finalintBOX=1,OVAL=2;DrawShapea=newDrawShape();publicvoidpaint(Graphicsg){a.setPos(40,20);a.setShape(BOX);a.draw(g);a.setPos(200,60);a.setShape(OVAL);a.draw(g);}}4.4.2成员方法的声明与修饰成员方法相当于其它语言的函数或过程,是命令语句的集合。成员方法的声明一般放在成员变量的声明之后,声明语句的格式和顺序如下:

[public][private][protected][package]//访问控制修饰符

[static][final][abstract][native][synchronized]

返回值类型方法名(参数表)[throws异常类型]不同含义的修饰符:1.final最终方法方法被声明为最终方法后,将不能被子类覆盖,即最终方法能被子类继承和使用但不能在子类中修改或重新定义它。这种修饰可以保护一些重要的方法不被修改。在OOP中,子类可以把父类的方法重新定义,使之具有新功能但又和父类的方法同名、同参数、同返回值,这种情况称为方法覆盖(override)。2.abstract抽象方法一个抽象类可以含有抽象方法。所谓抽象方法是指不能实现的方法,因为它没有方法体,所以抽象方法不能出现在非抽象类中。一个抽象类可以定义一个统一的编程接口,使其子类表现出共同的状态和行为,但各自的细节是不同的。子类共有的行为由抽象类中的抽象方法来约束,而子类行为的具体细节则通过抽象方法的覆盖来实现。3.native本地方法用其它语言编写的方法在Java中称为本地方法。SDK提供了Java本地接口JNI(JavaNativeInterface),使得Java虚拟机能运行嵌入在Java程序中的其它语言的代码。嵌入外部语言代码的出发点:Java系统包不提供对平台依赖性程序的支持时;想利用现有的其它语言资源时;出于运行速度的要求而使用其它语言开发的运行模块。4.synchronized同步方法同步方法用于多线程编程。为避免数据的不一致性,应将方法声明为同步方法,对数据进行加锁,以保证线程的安全。5.throws异常类型程序在运行时可能发生异常现象。每一个异常都对应着一个异常类。在前面介绍的例中就使用过抛出异常throwsIOException(输入/输出异常)。6.void返回值类型Java要求一个方法必须声明它的返回值类型。如果方法没有返回值就用关键字void作为返回值类型,否则应使用基本数据类型或对象类型说明返回值类型,如下面的语句:

publicintgetX();voidsetXY(intx,inty);publicStringgetName();protectedObjectclone();其中,getX的返回值为int类型,setXY没有返回值,getName的返回值是String类。而clone的返回值则为Object类。7.方法名方法名可以是任何有效的Java标识符。方法名可以和成员变量同名,也可以和成员方法同名。同一个类中的方法同名现象在OOP中称为方法重载(overload),重载可以减轻程序员的负担。

8.参数表方法的调用者正是通过参数表将外部消息传递给方法加以处理的。在参数表中要声明参数的类型,并用逗号分隔多个参数。4.4.3方法体方法体包含在一对大括号中,即使方法体中没有语句,一对大括号也是必不可少的。使用各种语句结构组成方法主体,实现程序的功能,是设计方法体的目的。下面这段程序是一个处理格式化字符串的方法:

publicStringtoString(int[]arr){inti,n=arr.size();StringBuffers=newStringBuffer();

s.append("[");for(i=0;i<n;i++){s.append(Integer.toString(arr[i]));if(i<n-1)s.append(",");}s.append("]");returns.toString();}程序代码:4.4.4方法的参数传递一个对象和外部交换信息主要靠方法的参数来传递。如果允许的话,外部对象也可以直接存取一个对象的成员变量。大部分还是通过参数来传递。在Java中,可传递的参数包括任何数据类型,前面已经使用了基本数据类型的参数传递、数组的传递和对象的传递。在其它语言中,函数调用或过程调用有传值调用和传地址调用之分。例4.7参数传递示例1classP1{publicstaticvoidmain(String[]args){intx=10,y=10;doPower(x,y);System.out.println("x="+x+",y="+y);}staticvoiddoPower(intpassX,intpassY){passX=passX*passX;passY=passY*passY;System.out.println("passX="+passX+",passY="+passY);}}例4.8参数传递示例2

classP2{publicstaticvoidmain(String[]args){Powerp=newPower();p.doPower(10,10);System.out.println("x="+p.x+",y="+p.y);}}classPower{intx,y;voiddoPower(intpassX,intpassY){x=passX*passX;y=passY*passY;}}4.4.5Java编程小结·源程序的文件名和程序中定义的主类名应保持一致,包括字母大小写的匹配。·Java严格区分大小写,例如applet和Applet代表了不同的含义。·语句以分号结束。·程序中可加注释,用双斜杠“//”引导,“/**/”可包含多行注释。·注意设计一般类与主类,一般类可以有多个,主类只能有一个,源程序名与主类名相同。习题1.静态变量有何特点?如何引用静态变量?2.静态方法有何特点?静态方法引用成员变量时有何要求?3.何为抽象类、抽象方法?4.类与对象有何关系?如何创建对象?5.要使某个类能被同一个包中的其他类访问,但不能被这个包以外的类访问,则A.让该类不使用任何关键字。B.使用private关键字。C.使用final关键字。D.使用protected关键字。

6.Java程序由什么构成?程序设计的基本思想是什么?7.什么是系统类、自定义类、父类、子类?8.什么是类变量、成员变量、实例变量、局部变量?9.指出下面关于继承的哪些叙述是正确的,说出理由。A.在java中只允许单一继承。B.在java中一个类只能实现一个接口。C.在java中一个类不能同时继承一个类和实现一个接口。D.

java的单一继承使代码更可靠。

10.在下面程序第十行,声明将调用哪种方法,说明理由。(7)1)classPerson{2)

publicvoidprintValue(inti,intj){/*…*/}3)

publicvoidprintValue(inti){/*...*/}4)}5)publicclassTeacherextendsPerson{6)

publicvoidprintValue(){/*...*/}7)

publicvoidprintValue(inti){/*...*/}8)

publicstaticvoidmain(Stringargs[]){9)

Teachert=newTeacher();10)

t.printValue(10);11)}12)}

11.指出下面关于垃圾收集的哪些叙述是对的。

A.

程序开发者必须自己创建一个线程进行内存释放的工作。

B.垃圾收集将检查并释放不再使用的内存。

C.垃圾收集允许程序开发者明确指定并立即释放该内存。

D.垃圾收集能够在期望的时间释放被java对象使用的内存。12.下面关于变量及其范围的陈述哪些是对的。

A.实例变量是类的成员变量。

温馨提示

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

评论

0/150

提交评论