面向对象的核心特性_第1页
面向对象的核心特性_第2页
面向对象的核心特性_第3页
面向对象的核心特性_第4页
面向对象的核心特性_第5页
已阅读5页,还剩69页未读 继续免费阅读

下载本文档

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

文档简介

面向对象的核心特性程序设计实用教程(第2版)》程序设计实用教程(第2版)》3.1面向对象程序设计概述第2页,共74页,2024年2月25日,星期天程序设计实用教程(第2版)》3.1.1面向对象术语的解释1.对象什么是对象:现实世界中解决问题的实物(包括有行为和属性)例如:咖啡猫黄色的(属性)爱睡觉(行为)2.类什么是类:对象的模板模板内容=类的特性(属性)+行为(方法)

类的成员例如:猫类(有颜色,猫龄等属性;有睡觉,吃食等行为。第3页,共74页,2024年2月25日,星期天程序设计实用教程(第2版)》3.1面向对象程序设计概述类与对象关系概念:类(class)是既包括数据又包括作用于数据的一组操作的封装体。对象(object)是类的实例(instance)。类对象抽象实例化方法数据或变量第4页,共74页,2024年2月25日,星期天程序设计实用教程(第2版)》3.继承什么叫继承?继承是接收来自父辈的财产在面向对象中继承的外延是什么?拥有父辈所拥有的东西

子类的继承→子类拥有父辈的成员例如:汽车继承车

//所有种类的汽车都需要实现汽车的基本功能类的继承实现了代码的重用。第5页,共74页,2024年2月25日,星期天程序设计实用教程(第2版)》4.接口接口像一个类定义的模板,它提供了与其他事物之间相互通信的规则条目,但并非具体实现。例如:多个程序员开发同一个应用程序的不同类,约定不同类之间使用同一组方法进行通信。则创建一个接口用于定义这些方法。第6页,共74页,2024年2月25日,星期天程序设计实用教程(第2版)》5.封装数据隐藏。成员的详细信息对于对象外的代码是私有的和不可见的。数据方法外界访问第7页,共74页,2024年2月25日,星期天程序设计实用教程(第2版)》3.1.2面向对象程序设计方法的优点1.可重用性2.可扩展性3.易于管理和维护

第8页,共74页,2024年2月25日,星期天程序设计实用教程(第2版)》3.2面向对象与UML建模建模是一项经过检验并被广为接受的工程技术。建立房屋和大厦的建筑模型,能帮助用户得到实际建筑物的印象。要生产合格的软件就要有一套关于体系的结构、过程和工具的规范。建模的目的:1.有助于按照实际情况或按照所需的样式使系统可视化2.能够规约系统的结构或行为3.给出指导系统构造的模板4.使做出的决策文档化第9页,共74页,2024年2月25日,星期天程序设计实用教程(第2版)》3.2.2UML建模语言什么是UML?——UnifiedModelingLanguage(统一建模语言)UML是一种用来创建程序模型的图形语言(即带有语意的一种图形记号)。可以用来说明代码中对象之间的关系。第10页,共74页,2024年2月25日,星期天程序设计实用教程(第2版)》3.2.3UML进行面向对象的系统分析设计UML进行面向对象的系统分析设计,其过程通常由以下3个部份组成。识别系统的用例和角色进行系统分析,并抽取类系统设计,并设计类及其行为第11页,共74页,2024年2月25日,星期天程序设计实用教程(第2版)》3.3Java语言与面向对象特性Java中的类:信息以类为单位单独封装Java中的封装:无需关心调用对象的内部细节Java中的继承:只准继承一个类,但可以“继承”多个接口。Java中的多态Java中的垃圾回收机制:自动回收垃圾内存第12页,共74页,2024年2月25日,星期天程序设计实用教程(第2版)》类的封装性、继承性和多态性类的封装性类的继承性类的多态性数据操作成员变量成员方法类类的封装性直接访问——访问权限类的继承性类的多态性外部直接访问第13页,共74页,2024年2月25日,星期天程序设计实用教程(第2版)》

类的继承性继承的概念:子类拥有父类的成员。特性:1.子类自动拥有父类全部成员(成员变量+方法)

人类(父)学生类(子)性别、姓名、身高、国籍……吃饭、睡觉、工作…….性别、姓名、身高、国籍……吃饭、睡觉、工作…….继承第14页,共74页,2024年2月25日,星期天程序设计实用教程(第2版)》2.子类可以更改父类继承的成员;如学生类中,“工作”方法会有自己的限制。3.子类可以增加自己的成员;如学生类中,添加“学习”、“考试”等方法。4.子类不能删除父类任何成员。第15页,共74页,2024年2月25日,星期天程序设计实用教程(第2版)》Java的单继承C++java父类1父类n子类父类子类接口多继承:一个类有多个直接父类。可以拥有多个父类的属性或方法。单继承:一个类只有一个直接父类,若需要继承其他方法,则通过接口实现。注意:java中只支持单继承。即子类只有一个直接父类。多继承特点通过接口实现。第16页,共74页,2024年2月25日,星期天程序设计实用教程(第2版)》类的多态性多态:允许拥有相同的形式,但在不同情况下拥有不同机能的特性。如“+”多态性——方法执行的多样性重载:方法名同,参数列表不同覆盖:子类重写了父类中同名的方法。第17页,共74页,2024年2月25日,星期天程序设计实用教程(第2版)》3.4类的定义和对象的创建程序运行可理解为做三件事:建立对象使用对象:对象之间传递消息,程序处理消息作出响应运行完毕收回对象所占空间。对象的生命周期:创建——运行——消亡获得内存空间进行各种操作使用完释放内存第18页,共74页,2024年2月25日,星期天程序设计实用教程(第2版)》3.4.1定义类:类声明+类主体类定义的格式:类声明{

成员变量的声明;

成员方法的声明及实现;}类主体类注意与c++有何区别!!变量与方法的声明与定义均不允许放在类主体外面!!!class类名

{代码;

}数据方法第19页,共74页,2024年2月25日,星期天程序设计实用教程(第2版)》声明类:权限特性名字语法:[修饰符]class

类[extends父类]

[implements接口列表]类的修饰符用来说明类的特殊性质。分为三种:访问控制符:public(公共类)、friendly(缺省类)protected(保护类)、private(私有类)-多见于内嵌类)抽象类说明符:abstract最终类说明符:final关键字类名表示继承哪个父类表示继承哪些接口第20页,共74页,2024年2月25日,星期天程序设计实用教程(第2版)》例:声明一个公共类Data1:

publicclassData1

定义一个公共类人类:定义一个类学生类:publicclassMan{}classStudent{}第21页,共74页,2024年2月25日,星期天程序设计实用教程(第2版)》3.4.2类之间的关系USES-A关系HAS-A关系IS-A关系第22页,共74页,2024年2月25日,星期天程序设计实用教程(第2版)》1.USES-A关系

类A的方法操纵了类B(对象)的成员,则称之为类A”USES-A”(用到了)类B.例3-1轿车类(Car)其他类(Sample3_1)调用USES-A关系PublicclassSample3_1{…c.startIsEnough();…}第23页,共74页,2024年2月25日,星期天程序设计实用教程(第2版)》2.HAS-A关系HAS-A关系是一种拥有关系,若类A中有B类型的成员引用变量,则类A“HAS-A”

(拥有)类B.例3-2c.getTyreInfo().getMaterial();轿车类(Car)轮胎类(Tyre)拥有HAS-A关系第24页,共74页,2024年2月25日,星期天程序设计实用教程(第2版)》3.IS-A关系在面向对象中“IS-A”的概念是基于继承的,旨在表达一个类是另一个类的子类。也就是说,若类A是类B子类的一种,则可以说类A“IS-A”(是一种)类B。例如:“苹果”是“水果”的种类classFruit{…public

voidcanEat(){…}

}classApple{

…}Applea=newApple()a.canEat();水果苹果继承IS-A关系第25页,共74页,2024年2月25日,星期天程序设计实用教程(第2版)》3.4.3构造函数

要使用对象,首先必须构造它们,并指定它们的初始状态,然后将方法应用于对象。在Java程序设计语言中,使用构造函数来构造新的实例,作用是构造并初始化对象。

第26页,共74页,2024年2月25日,星期天程序设计实用教程(第2版)》构造函数的创建创建无参构造函数例3-3创建带参构造函数例3-4第27页,共74页,2024年2月25日,星期天程序设计实用教程(第2版)》构造函数的特点有:(1)构造函数的方法名与类名相同。(2)构造函数没有返回类型,也无需声明类型。(3)构造函数的主要作用是完成对类对象的初始化工作,并传递参数。(4)构造函数不能由编程人员显式地直接调用。由系统调用。(5)一个类可以定义多个构造方法,缺省构造函数为无参的默认构造函数,不执行任何代码。(6)构造方法可以重载,以参数的个数、类型或排列顺序区分。第28页,共74页,2024年2月25日,星期天程序设计实用教程(第2版)》3.3.4类成员声明成员变量[修饰符][static][final][transient]数据类型

变量名访问控制符:public(公共类)friendly(缺省类)protected(保护类)

private(私有类)类(静态)成员变量常量临时变量类声明{成员变量的声明;

成员方法的声明及实现;}第29页,共74页,2024年2月25日,星期天程序设计实用教程(第2版)》例3-5:定义Student类,声明3个成员变量分别表示姓名、年龄、班级:publicclassStudent //类声明{publicStringstuName;publicintstuAge;publicStringstuClass;}成员变量的引用//声明成员变量第30页,共74页,2024年2月25日,星期天程序设计实用教程(第2版)》2.成员变量的初始值创建对象后,如果对象有成员变量,则系统会自动为其分配一个初始值。例3-6例3-7注意:对象引用型成员变量,其初始值为“null”,表示此引用没有指向任何对象。第31页,共74页,2024年2月25日,星期天程序设计实用教程(第2版)》3.4.5对象的创建声明对象类名对象例:Students;对象实例化对象=new类的构造方法([参数列表])s=newStudent();引用对象的成员变量及方法:用“.”运算符对象.成员变量对象.成员方法([参数列表])=王强;

//引用对象的成员变量Student第32页,共74页,2024年2月25日,星期天程序设计实用教程(第2版)》3.5方法方法的定义方法的基本组成:方法的声明+方法体[修饰符][static]返回值类型

方法([参数列表])[throws异常类]{

语句序列;[return[返回值]];}方法声明:方法体:第33页,共74页,2024年2月25日,星期天程序设计实用教程(第2版)》

例:intsub(inta,intb){returna-b;}intsub(inta,intb){intc;c=a-b;returnc;}第34页,共74页,2024年2月25日,星期天程序设计实用教程(第2版)》说明:1.参数序列指定要传递给方法什么样的信息(1)可以是java中的任何类型,包括基本数据参数类型、对象引用类型。(2)每个参数必须包括类型与变量标识符,若有多个参数,则用逗号将其分隔。如(inta,intb)第35页,共74页,2024年2月25日,星期天程序设计实用教程(第2版)》2.方法体方法体是该方法具体业务代码的实现。return语句负责方法的返回。3.返回值类型返回值类型指定了该方法返回结果的类型。可以是基本数据类型或对象引用类型,没有返回值也要使用void关键字。第36页,共74页,2024年2月25日,星期天程序设计实用教程(第2版)》返回值规则:可以在具有对象引用返回类型的方法中返回null,但基本数据类型作为返回类型则不可以返回null。对象给也是完全合法的返回值类型,如数组。在具有基本数据返回类型的方法内,可以返回任何值,只要其能够自动转换返回值类型。如返回值为double,返回整数4是可以的。但返回值为int时,返回一个浮点数12.43则报错。一定不能在具有void返回类型的方法中返回任何内容。在具有对象引用返回类型的方法内,可以返回任何类型的对象引用,只要返回的引用与返回类型相同或可自动转换为返回类型即可。第37页,共74页,2024年2月25日,星期天程序设计实用教程(第2版)》3.5.2方法重载概念:同一个类中多个方法有相同的名字,不同的参数列表,这种情况称为方法重载。如:publicdoublechangeSize(intsize,Stringname,floatpattern)publicvoidchangeSize(intsize,Stringname)privateintchangeSize(intsize,floatpattern)voidchangeSize(floatpattern,Stringname)?方法返回类型不同,参数相同,算不算重载?注意:返回类型不同并不足以构成方法重载。当重载方法被调用时,编译器根据参数的类型和数量来确定实际调用哪个重载方法的版本。例3-8第38页,共74页,2024年2月25日,星期天程序设计实用教程(第2版)》

方法调用进行匹配的时候,首先选择直接匹配的方法,如果没有,则将参数进行提升转换后再匹配方法,总是匹配最接近的方法。基本类型则按照基本数据类型间的自动转换关系;引用类型则寻找最能兼容传递的参数。例3-9多匹配选择示例例3-10第39页,共74页,2024年2月25日,星期天程序设计实用教程(第2版)》3.5.3递归

递归方法就是自调用方法,在方法体内直接或间接地调用自己。有两种方式:1.直接递归2.间接递归第40页,共74页,2024年2月25日,星期天程序设计实用教程(第2版)》直接递归:即在方法体内调用方法本身。例:求斐波那数列第n项斐波那数列:f(0)=f(1)=1f(n)=f(n-1)+f(n-2)(n>1)例3-11第41页,共74页,2024年2月25日,星期天程序设计实用教程(第2版)》间接递归:函数中调用其他函数,其他函数又调用本函数。例3-12第42页,共74页,2024年2月25日,星期天程序设计实用教程(第2版)》3.6静态成员静态修饰符——static,修饰类中的静态属性和方法(1)静态属性——被static修饰的属性称为静态属性(类属性)。特点:它们是类的属性,而不属于任何一个类的具体对象。即在一个类中只能有一个这类字段,并且由类调用,无需引用任何对象。

(2)静态方法——被static修饰的方法成为静态方法(类方法)。特点:不与任何对象相关联。能够在它的类的任何对象访问前辈访问,即使没有对象也能调用该方法。静态方法只能调用静态属性。第43页,共74页,2024年2月25日,星期天程序设计实用教程(第2版)》例:publicclassStaticDemo{publicstaticStrings=“我是静态变量”

publicstaticvoidprintInfo(){System.out.println(“我是静态方法”)};

}问?在其他类中如何调用静态变量和方法?例3-13第44页,共74页,2024年2月25日,星期天程序设计实用教程(第2版)》3.6.2静态变量与常量

在java中,表示常量的方法是通过静态成员变量的方式来实现的:如:声明3个常量X,Y,Z:

publicstaticfinalintX=10;public

staticfinalintY=20;

publicstaticfinalintZ=40;“publicstaticfinal”相当于表示常量的修饰符。公共的,即所有对象都能够访问。静态的,即无需创建任何对象直接可通过类调用。最终的,即定义的值为永久的,不能改变。第45页,共74页,2024年2月25日,星期天程序设计实用教程(第2版)》静态属性的初始化静态成员变量的初始化要求在静态语句块结束之前必须完成。一方面可以在声明的同时进行初始化,另一方面可以在静态语句块中进行初始化。例3-4第46页,共74页,2024年2月25日,星期天程序设计实用教程(第2版)》3.6.3静态成员的访问<类名>.<静态成员名>例3-151.静态方法访问非静态成员静态成员生命周期比非静态要长,当访问静态成员时,非静态成员不一定存在,因此静态方法不能访问非静态属性。同样道理,静态方法不能使用this预定对象关键字。第47页,共74页,2024年2月25日,星期天程序设计实用教程(第2版)》例3-16静态方法访问非静态成员示例1例3-17静态方法访问非静态成员示例2第48页,共74页,2024年2月25日,星期天程序设计实用教程(第2版)》2.非静态方法访问静态成员非静态方法产生时,静态成员已经存在。因此静态方法在任何时候都可以访问静态成员。例3-18第49页,共74页,2024年2月25日,星期天程序设计实用教程(第2版)》3.6.4main方法Main方法——特殊的静态方法,作为程序的入口,由于不对任何对象施加操作(实为执行时还无任何对象产生),因此声明为static;该方法由虚拟机调用,所以必须为public;而方法不需要返回值,因此声明为void。声明:publicstaticvoidmain(Stringargs[])例3-19Main方法规定有一个类型为String的入参,取名为args。用于接收命令行输入的参数。第50页,共74页,2024年2月25日,星期天程序设计实用教程(第2版)》3.6.5Factory方法Java的静态方法有一种常见的用途,就是使用Factory方法产生不同风格的对象,例如NumberFormat类使用Factory方法产生不同风格的格式对象。FactoryMethod是最常用的模式了,Factory方法在Java程序系统中可以说是随处可见。Factory方法就相当于创建实例对象的new,我们经常要根据类Class生成实例对象,如Aa=newA(),FactoryMethod也是用来创建实例对象的,所以以后new时可以考虑实用factory模式(工厂模式),虽然这样做,可能多做一些工作,但会给系统带来更大的可扩展性和尽量少的修改量。第51页,共74页,2024年2月25日,星期天程序设计实用教程(第2版)》Factory作用:完成复杂情况下的初始化工作。尽量将长的代码分派“切割”成每段,将每段再“封装”起来。这样就需要将创建实例的工作与使用实例的工作分开,也就是说,让创建实例所需要的大量初始化工作从构造函数中分离出去。这时我们就需要Factory工厂模式来生成对象了。使用工厂方法要注意几个角色,首先要定义产品接口,如Fruit,产品接口下有接口的实现类,如Apple,其次要有一个factory类,用来生成产品。例Factory方法实例:例3-20第52页,共74页,2024年2月25日,星期天程序设计实用教程(第2版)》3.7包概念:包是一种将相关类,接口或其他包组织起来的集合体。目的:用来管理类名空间,将包含类代码的文件组织起来,易于查找和使用,避免同名类发生冲突。内容:类,接口及其他包。说明:包是一种松散的类集合,一般在不要求处于同一个包中的类有明确的相互关系,但是由于同一包的类在默认情况下可以互相访问,因此常把需要在一起工作的类放在一个包里。包也称类库第53页,共74页,2024年2月25日,星期天程序设计实用教程(第2版)》3.7.1包的定义(1)缺省情况下为无名包(2)有名包的创建:使用package语句 如:packagepname;3-13

或packagedir1.dir2.pname;

包就是一个文件夹,里面存放该程序所生成的所有.class文件,包中的“.”号表示子文件夹。默认包中类之间可以相互访问public,protected或默认访问权限的数据成员和成员函数。默认包中的类不能被其他包中的类引用。第54页,共74页,2024年2月25日,星期天程序设计实用教程(第2版)》package语句必须放在源文件最前面,之前不可以有其他任何语句;每个源文件最多只能有一条package语句。例3-21

将类Sample3_21放至包chapter03的sample3_21中。第55页,共74页,2024年2月25日,星期天程序设计实用教程(第2版)》JDK环境下包中类的编译和运行编译时:javac运行:d:\java>java –d

CLASSPATH路径

Myclass.javaCLASSPATH变量指明包存放的位置。例如: javac–dd:\javaSample3_21.java结果:直接在d:\java下创建在myclass.java指明的包目录,并把Myclass.class拷到该目录下。包名.myclass例如: javachapter03.sample3_21.Sample3_21第56页,共74页,2024年2月25日,星期天程序设计实用教程(第2版)》3.7.2类的导入(1)加载引用(类短名)——使用import语句 格式:importmypack1.mypack2.Myclass

或importmypack1.mypack2.*注意:1.Import语句必须先于所有类声明。2.使用(*)只能表示本层次的所有类,而不包括子层次下的类。如importjava.awt.*;importjava.awt.event.*;//上面的语句未包括event 子包中的类3.用(*)一般适用于要用到同个包当中的多个类的情况。第57页,共74页,2024年2月25日,星期天程序设计实用教程(第2版)》(2)类长名:直接使用包名、类名前缀(用在语句中) 格式:mypack1.mypack2.Myclass例如:java.util.Dated1=new

java.util.Date()

第58页,共74页,2024年2月25日,星期天程序设计实用教程(第2版)》(3)直接引用:在同一文件夹下(私有类除外)

将无名包中的引用类与被引用类存贮在同一物理空间例如:假如Car和Sample3_3这两个类在向一个目录下,你就可以在Sample3_3类中创建一个Car实例,无需导入Car这个类。第59页,共74页,2024年2月25日,星期天程序设计实用教程(第2版)》注意:java中java.lang包中的类系统是自动引入的,即使不用import语句,每个源文件中系统编译时都会自动引入java.lang.*中的类。第60页,共74页,2024年2月25日,星期天程序设计实用教程(第2版)》两种特殊情况需要注意:1.两个包中有同名类,但只用到其中一个及其他不同名的类,则在import语句中明确给出需要引用的类名。如例3-222.两个包中有同名类,且都要使用,则直接在语句中指明调用哪个类。如例3-23第61页,共74页,2024年2月25日,星期天程序设计实用教程(第2版)》3.7.3静态导入从JavaSE5.0开始,导入语句不但可以导入类,还具有导入静态方法和静态成员变量的功能,不过需要在关键字“import”和包名之间添加关键字“static”,语法如下。importstatic<包名>.<类名>.*;importstatic<包名>.<类名>.<具体方法/成员变量名>;“*”还是代表通配符,不过这里表示的是指定类下面所有静态的方法或成员变量。如果要明确指明要使用的方法或成员变量,用第2行语法。碰到不同类下同名静态方法或成员变量时,解决冲突的方法类似上一小节,这里不再赘述。第62页,共74页,2024年2月25日,星期天程序设计实用教程(第2版)》3.8成员的访问控制成员的访问是指以下两种不同的操作:一个类中的方法代码是否能够调用(调用)另一个类中的成员。一个类是否能够继承其父类的成员。第63页,共74页,2024年2月25日,星期天程序设计实用教程(第2版)》

所有类A

所有子类C同包中类B

包中子类E本类Dpublic(公共)类、变量、方法Aprotected(保护)变量、方法BUCdefault(默认)类、变量、方法Bprivate(私有)变量、方法Dprivateprotected(私有保护)变量、方法C访问控制符:第64页,共74页,2024年2月25日,星期天程序设计实用教程(第2版)》公共类型:public例3-26私有类型:private例3-27默认类型:default例3-28保护类型:protected第65页,共74页,2024年2月25日,星期天程序设计实用教程(第2版)》封装是一个面向对象的术语,其含义很简单,就是把东西包装起来。换言之,成员变量和方法的定义都包装于类定义之中,类定义可以看成是将构成类的成员变量和方法封装起来。通过限定类成员的可见性,可以使类成员中的某些属性和方法能够不被程序的其他部分访问,它们被隐藏了起来,只能在定义的类中使用,这就是面向对象中实现封装的方式。3.9封装成员变量成员方法类直接访问外部直接访问第66页,共74页,2024年2月25日,星期天程序设计实用教程(第2版)》Java中封装需要遵循的规则:用访问限制修饰符保护成员变量,通常是private。建立公有的public访问方法,强制调用代码通过这些方法访问成员变量,而不是直接调用。例3-29第67页,共74页,2024年2月25日,星期天程序设计实用教程(第2版)》分析:width和height成员变量被封装,必须通过setProerty方法才能访问,由于在setProerty方法中设置了检验值正确性的规则,所以不可能设置错误的width和height值,增加代码的健壮性。封装后不但可以提高健壮性,还可以提高灵活性,例如,若因需要将height或width的值改为String类型,如果没有封装,代码一旦修改,则所有调用该值的代码都需要更改;而封装后只需要修改设置成员值的方法,将变化限制在一个较小的范围内,使外界无需做任何改变仍能继续调用。例3-30第68页,共74页,2024年2月25日,星期天程序设计实用教程(第2版)》3.10利用系统已有的类通过前面几节的介绍,读者已经对类的定义及对象的创建与使用有了一定的了解。本节将介绍Java类库中提供的几个常用的处理日期时间的类。通过对这几个类的介绍,使读者了解利用系统已有的类的思想。第

温馨提示

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

评论

0/150

提交评论