版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第5章 面向对象的特性Object Oriented Techniques目录5.1面向对象特性面向对象特性5.2抽象类抽象类5.3接口接口5.4内部类内部类5.5异常类异常类5.6泛型类泛型类5.1 面向对象特性面向过程的代码面向过程的代码Procedure callLoose cohesionTight couplingRedundancyComponent BGoto D1Component DGoto D1D1:Change V1 to zero V1=V2-A1Increment V1Global:V1V2Common data areaComponent ZComponent XC
2、omponent YComponent AComponent BControl datal Maintainability 可维护性可维护性l Reusability 可重用性可重用性l Extensibility 可扩展性可扩展性Component AComponent BData Structure5.1 面向对象特性多态多态polymorphism封装封装Encapsulation继承继承Inheritance抽象抽象Abstraction面向对象的代码面向对象的代码Messagingl Maintainability 可维护性可维护性l Reusability 可重用性可重用性l Ex
3、tensibility 可扩展性可扩展性1封装性多态多态polymorphism继承继承Inheritance抽象抽象Abstraction封装封装Encapsulation封装(封装(Encapsulation) First Principle of OO 通过对象的封装,实现了通过对象的封装,实现了模块化模块化 通过对类和类的成员施以一定的通过对类和类的成员施以一定的访问权限访问权限,实现了,实现了信息信息隐藏隐藏 javajava中的限定词中的限定词同一个类同一个类同一个包同一个包不同包的子类不同包的子类不同包非子类不同包非子类private*default *protected*pub
4、lic*1封装性 未封装未封装的全局变量的全局变量 Box . x 可以造成系统中所有类之间产生紧耦合可以造成系统中所有类之间产生紧耦合 系统可维护性差系统可维护性差1封装性 Java中中实例实例变量变量最低限度最低限度的封装的封装 没有封装没有封装x的的身份身份 类的类的public成员构成类的成员构成类的输出输出API1封装性 隐藏隐藏实例成员变量实例成员变量 添加添加存取方法存取方法 解除对实例成员的耦合解除对实例成员的耦合 x从输出从输出API变成了类的内部实现变成了类的内部实现封装成员的封装成员的身份身份gettersetter(mutator)1封装性x: String ?No C
5、hange! x成为成为Box的内部实现的内部实现 不再影响不再影响Client 防止修改防止修改1封装性 可维护性、冗余性可维护性、冗余性 对于易发生变化的成对于易发生变化的成员,在内部访问时使员,在内部访问时使用用存取方法存取方法类的内部对成员的访问类的内部对成员的访问1封装性封装封装引用类型引用类型成员成员“myBox”在在Room中中 良好的封装了吗?良好的封装了吗?1封装性封装封装引用类型引用类型成员成员 boxbox中中x x是局部变量的拷是局部变量的拷贝,局部变量贝,局部变量x x改变不影响改变不影响 boxbox状态状态 在在Room中进行中进行防御拷防御拷贝(贝(defens
6、ive copy)1封装性引用类型引用类型成员的成员的getter方法破坏封装性方法破坏封装性 getter方法破坏了方法破坏了Room对对Box的封装的封装1封装性不可变更类不可变更类 封装性、安全性的考虑封装性、安全性的考虑不可变更类的实例一旦被创建,其状态就不会发生变化不可变更类的实例一旦被创建,其状态就不会发生变化 String、基本数据类型的类包装器、基本数据类型的类包装器特点:特点: “private”成员属性成员属性 成员没有成员没有setter方法方法 “final”class “final”成员属性成员属性 通常不提供可变成员的通常不提供可变成员的getter方法方法 通常不
7、在构造函数中引用外部可变对象通常不在构造函数中引用外部可变对象线程安全线程安全实例可以被重用(对象池)实例可以被重用(对象池) 享元模式享元模式( flyweight design pattern )1封装性防御拷贝(防御拷贝(defensive copy) 防御拷贝应该在参数有防御拷贝应该在参数有效性验证效性验证之前之前 参数有效性验证必须针参数有效性验证必须针对对拷贝后拷贝后的变量的变量1封装性防御拷贝(防御拷贝(defensive copy) 返回可变对象的防御拷返回可变对象的防御拷贝贝封装性 总结最大限度的降低数据的可见性最大限度的降低数据的可见性 谨慎设计和输出公共谨慎设计和输出公共
8、API 耦合性耦合性 可维护性可维护性 可扩展性可扩展性publicprotecteddefaultprivateexported APIimplementationpackage封装性 总结 公共的类构成了包(一个子系统)的外观公共的类构成了包(一个子系统)的外观 ( faade ) 当一个类只被一个其他类访问的时候,可以作为该当一个类只被一个其他类访问的时候,可以作为该类的内部类类的内部类 ( innner class) 不能因为测试类的正确性,而提高其可见性不能因为测试类的正确性,而提高其可见性 如果包中一个类频繁访问另一个类的成员变量时,如果包中一个类频繁访问另一个类的成员变量时,应考
9、虑重构设计应考虑重构设计包对类的封装性包对类的封装性public class封装性 总结 类不应该直接暴露成员变量(类不应该直接暴露成员变量(fields) 反例反例:java.awt.Point,java.awt.Dimension 类的成员变量应尽可能设置为私有的(类的成员变量应尽可能设置为私有的(private) “static final”可以设置为公有,但必须为简单类型可以设置为公有,但必须为简单类型或不可变的引用类型或不可变的引用类型 “protected”会引起成员变为会引起成员变为API的一部分的一部分 根据类是否为可变类型,来提供相应的根据类是否为可变类型,来提供相应的get
10、ter和和setter 对于可变的对于可变的引用成员引用成员变量,在构造函数和变量,在构造函数和getter方法方法中使用防御拷贝中使用防御拷贝 在类的内部对不稳定的属性,使用在类的内部对不稳定的属性,使用getter和和setter访问访问类对成员的封装性类对成员的封装性2继承性(Inheritance) 实现实现代码复用代码复用 组合(组合(has-a) 继承(继承(is-a) 把一些类的共性再把一些类的共性再抽取抽取出来,放到一个类中,称为出来,放到一个类中,称为父类父类 具有特殊属性的新类继承父类的状态和行为,称为具有特殊属性的新类继承父类的状态和行为,称为子类子类 子类继承了父类的属
11、性和方法子类继承了父类的属性和方法(不包括构造方法不包括构造方法),同,同时也可以拥有自己的属性和方法时也可以拥有自己的属性和方法 继承具有传递性继承具有传递性 父类可以是父类可以是Java类库中的类,也可以是自己编写的类类库中的类,也可以是自己编写的类 Java中每个类只能有一个直接父类,称为中每个类只能有一个直接父类,称为单继承单继承2继承性(Inheritance)2继承性(Inheritance)我吃素,可脾气我吃素,可脾气不太好不太好2继承性(Inheritance)在狗群中,吠叫声是个在狗群中,吠叫声是个很重要的事情,该声音很重要的事情,该声音必须有代表性和独一无必须有代表性和独一
12、无二性二性2继承性(Inheritance)对呀,对呀,LionLion、TigerTiger和和CatCat之间有共同的部分之间有共同的部分狼和狗之间也可以狼和狗之间也可以共享某些东西共享某些东西2继承性(Inheritance)它们都是它们都是猫科动物猫科动物它们都是它们都是犬齿动物犬齿动物2继承性(Inheritance) 创建子类创建子类class SubClass extends SuperClass java中所有的类都是通过直接或间接地继承中所有的类都是通过直接或间接地继承java.lang.Object类得到的,如果一个类没使用类得到的,如果一个类没使用extends,该类被系
13、统默认为,该类被系统默认为是是Object类的子类。类的子类。 java不支持多重继承不支持多重继承。 子类不能继承父类中权限为子类不能继承父类中权限为private的成员变量和方法。的成员变量和方法。2继承性 子类继承父类的变量和方法可以被子类自身定义的方子类继承父类的变量和方法可以被子类自身定义的方法所访问法所访问 子类和父类在同一包中,子类继承父类中不是子类和父类在同一包中,子类继承父类中不是private的成员变量和方法的成员变量和方法 子类和父类不在同一包中,子类继承父类中的子类和父类不在同一包中,子类继承父类中的protected, public成员变量和方法成员变量和方法 继承的
14、成员变量及方法的访问权限保持不变继承的成员变量及方法的访问权限保持不变下面我们看一个下面我们看一个例子例子。程序的运行结果见下图程序的运行结果见下图5.3 子类对象的构造过程 当用子类的构造方法创建一个子类的对象时当用子类的构造方法创建一个子类的对象时,子类总子类总是先调用是先调用父类的构造方法父类的构造方法,如果子类的构造方法中没,如果子类的构造方法中没有显式指明使用哪一个构造方法,子类调用父类有显式指明使用哪一个构造方法,子类调用父类不带不带参数参数的构造方法。的构造方法。 (1)将子类中声明的成员变量做为子类对象的成员变)将子类中声明的成员变量做为子类对象的成员变量量 (2)父类的成员变
15、量也都分配了内存空间,但只将其)父类的成员变量也都分配了内存空间,但只将其中一部分(继承的那部分)做为子类对象的成员变量。中一部分(继承的那部分)做为子类对象的成员变量。子类未继承的成员子类未继承的成员 子类未继承的成员子类未继承的成员 引用引用子类对象子类对象 子类继承的成员子类继承的成员 子类继承的成员子类继承的成员 子类声明的成员子类声明的成员 子类声明的成员子类声明的成员子类对象内存示意图子类对象内存示意图5.4 成员的覆盖(隐藏) 子类拥有与父类相同的成员的情况称为覆盖子类拥有与父类相同的成员的情况称为覆盖(override) 子类通过覆盖父类的子类通过覆盖父类的成员变量成员变量和和
16、方法方法,可以把父,可以把父类的状态和行为改变为自身的状态和行为。类的状态和行为改变为自身的状态和行为。 成员变量的覆盖:变量名相同成员变量的覆盖:变量名相同 成员方法的覆盖:返回值类型、方法名、形式成员方法的覆盖:返回值类型、方法名、形式 参数都相同参数都相同5.4.1 成员变量的隐藏(覆盖)子类中定义的成员变量与父类中的成员变量同名时子类中定义的成员变量与父类中的成员变量同名时(不必类型相同不必类型相同),子类就隐藏了),子类就隐藏了继承的继承的成员变量成员变量父类的方法会看到原来的变量,而子类的方法看到的父类的方法会看到原来的变量,而子类的方法看到的则是新则是新“版本版本”的变量的变量成
17、员变量的隐藏成员变量的隐藏 例例5-3成员变量的隐藏(覆盖)例如:例如:class IntegerCalculator int sum; class DecimalCalculator extends IntegerCalculator double sum; 类类DecimalCalculator 从从IntegerCalculator中继承的方法将中继承的方法将看到整型变量,而看到整型变量,而DecimalCalculator类中定义的方法则会类中定义的方法则会看到浮点型变量看到浮点型变量如果需在如果需在DecimalCalculator类内引用从类内引用从IntegerCalculato
18、r继承得到的同名变量,需要使用继承得到的同名变量,需要使用super int s = super.sum;5.4.2 方法的覆盖(重写 override)子类定义一个方法,该方法的名字、子类定义一个方法,该方法的名字、返回类型返回类型、参数个、参数个数和类型与从父类继承的方法数和类型与从父类继承的方法完全相同完全相同如果子类重写了父类的方法,就隐藏了继承的方法,子如果子类重写了父类的方法,就隐藏了继承的方法,子类对象调用该方法则调用的是重写的方法,要调用被隐类对象调用该方法则调用的是重写的方法,要调用被隐藏的方法则必须使用藏的方法则必须使用super关键字关键字重写的方法既可以操作继承的成员变
19、量,也可以操作子重写的方法既可以操作继承的成员变量,也可以操作子类声明定义的成员变量类声明定义的成员变量子类通过方法的重写可以把父类的状态和行为改变为自子类通过方法的重写可以把父类的状态和行为改变为自身的状态和行为身的状态和行为方法重写方法重写例例5-4【Method1.java】class Aint x; void setX( ) x=0; class B extends Aint x; /隐藏了父类的隐藏了父类的x xvoid setX( ) x=5; 5.4.2 方法的覆盖(重写 override) 注意:注意: 从从JDK5.0开始,在重写方法时可以返回父类方法开始,在重写方法时可以返
20、回父类方法返回值类型的子类型返回值类型的子类型 例子:例子:Chicken.java5.4.2 方法的覆盖(重写 override)5.4.2 方法的覆盖(重写 override)方法重写的两种方法重写的两种失败失败情况:情况:方法名相同,参数个数和类型相同,但返回类型不同方法名相同,参数个数和类型相同,但返回类型不同(或或不是父类方法返回类型的子类不是父类方法返回类型的子类),出现,出现编译错误编译错误方法名相同,参数个数和类型有不同,称为重载的方法方法名相同,参数个数和类型有不同,称为重载的方法重写父类方法时,不可以降低方法的访问权限重写父类方法时,不可以降低方法的访问权限父类中的一个静态
21、方法可以由子类中的另一个静态方法父类中的一个静态方法可以由子类中的另一个静态方法所遮蔽,但不能用一个非静态方法来覆盖一个静态方法所遮蔽,但不能用一个非静态方法来覆盖一个静态方法5.4.3 访问修饰符protected的进一步说明 一个类一个类A A中的中的protectedprotected成员变量和方法可以被它的直接子类成员变量和方法可以被它的直接子类和间接子类继承,比如和间接子类继承,比如B B是是A A的子类,的子类,C C是是B B的子类的子类 ,D D又是又是C C的子类,那么的子类,那么B B、C C和和D D类都继承了类都继承了A A的的 protectedprotected成员
22、变量和成员变量和方法。方法。 如果用如果用D D类在类在D D本身中创建了一个本身中创建了一个D D类的对象(类的对象(在在D D中创建中创建A A的的对象不一定能访问对象不一定能访问protectedprotected成员,取决于成员,取决于A A和和D D是否在同一是否在同一个包个包),那么该对象总是可以通过),那么该对象总是可以通过“.”.”运算符访问继承的运算符访问继承的或自己定义的或自己定义的protectedprotected变量和变量和protectedprotected方法的,但是,如方法的,但是,如果在另外一个类中,比如果在另外一个类中,比如E E类,用类,用D D类创建了一
23、个对象类创建了一个对象objectobject,该对象通过该对象通过“.”.”运算符访问运算符访问protectedprotected变量和变量和protectedprotected方方法的权限如下列(法的权限如下列(a a)、()、(b b)所述。)所述。 (a a)子类)子类D D的的protectedprotected成员变量和方法,如果不是从成员变量和方法,如果不是从父类继承来的,父类继承来的,objectobject访问这些访问这些protectedprotected成员变量和方法成员变量和方法时,只要时,只要E E类和类和D D类在同一个包中就可以了。类在同一个包中就可以了。 (b
24、 b)如果子类)如果子类D D的对象的的对象的protectedprotected成员变量或成员变量或protectedprotected方法是从父类继承的,那么就要一直追溯到该方法是从父类继承的,那么就要一直追溯到该protectedprotected成员变量或方法的成员变量或方法的“祖先祖先”类,即类,即A A类,如果类,如果E E类类和和A A类在同一个包中,类在同一个包中,objectobject对象能访问继承的对象能访问继承的protectedprotected变量和变量和protectedprotected方法。方法。例子:例子:ProtectRightProtectRight P
25、rotectSubProtectSubthis this用来引用当前变量和方法。用来引用当前变量和方法。 访问成员变量。访问成员变量。如:this.variable; 调用方法。调用方法。如:this.Method(paramlist); 调用类的其他构造方法。调用类的其他构造方法。如:this(paramlist);5.5 关键字super java中通过中通过super来实现对来实现对父类成员父类成员的访问,的访问,super用用来引用当前对象的父类。来引用当前对象的父类。 访问父类被隐藏的成员变量。访问父类被隐藏的成员变量。如:super.variable; 调用父类中被重写的方法。调用
26、父类中被重写的方法。如:super.Method(paramlist); 调用父类的构造方法。调用父类的构造方法。如:super(paramlist); 例例5-6 、Inheritance. java 、SuperTest.java5.5 关键字super 注意:注意: 如果在父类中没有无参数的构造函数,则在子如果在父类中没有无参数的构造函数,则在子类的构造函数中必须用类的构造函数中必须用super显式调用父类的显式调用父类的某个构造函数某个构造函数 例子:例子:RDemoTest.java5.5 关键字super 一种常见的做法是子类中的一个覆盖得到的方法完成一一种常见的做法是子类中的一个
27、覆盖得到的方法完成一些预备的工作,然后再交由父类中的覆盖方法来完成任些预备的工作,然后再交由父类中的覆盖方法来完成任务务 class Animal void eat (Food f) /消化食物消化食物 class Cat extends Animal void eat (Food f) / 检查是否可信用检查是否可信用 super.eat(f); 5.6 final 类和final方法 final final类不能被继承,即不能有子类,如:类不能被继承,即不能有子类,如: final class A final class A 一个方法被修饰为一个方法被修饰为finalfinal方法,则这个
28、方法不能被重写,即方法,则这个方法不能被重写,即不允许子类通过重写隐藏继承的不允许子类通过重写隐藏继承的finalfinal方法。方法。5.7 对象的上转型对象 假设,假设,B B是是A A的子类或间接子类,当我们用子类的子类或间接子类,当我们用子类B B创建一个创建一个对象,并把这个对象的引用放到对象,并把这个对象的引用放到A A类声明的对象引用中时,类声明的对象引用中时,比如:比如: A aA a; B b = new B();B b = new B(); a=b; a=b; 则则a a是子类对象是子类对象b b的的上转型对象上转型对象,对象的上转型对象的,对象的上转型对象的实实体是子类负
29、责创建体是子类负责创建的,但上转型对象会失去原对象的一的,但上转型对象会失去原对象的一些属性和功能。些属性和功能。5.7 对象的上转型对象 (1 1)上转型对象不能操作子类声明定义的成)上转型对象不能操作子类声明定义的成员变量;也不能使用子类声明定义的方法。员变量;也不能使用子类声明定义的方法。 (2 2)上转型对象可以调用子类重写的)上转型对象可以调用子类重写的实例实例方方法。法。 (3 3)上转型对象可以调用子类继承的成员变)上转型对象可以调用子类继承的成员变量和隐藏的成员变量。量和隐藏的成员变量。 (4 4)可以将对象的上转型对象再强制转换到)可以将对象的上转型对象再强制转换到一个子类对
30、象,这时,该子类对象又具备了子类一个子类对象,这时,该子类对象又具备了子类所有属性和功能所有属性和功能 (5 5)如果子类重写了父类中的)如果子类重写了父类中的类类方法,通过方法,通过上转型对象引用的是父类中的类方法上转型对象引用的是父类中的类方法对象的上转型对象 可以将对象的上转型对象再可以将对象的上转型对象再强制转换强制转换到一个子类对象,这时,到一个子类对象,这时,该子类对象又具备了子类所有属性和功能。该子类对象又具备了子类所有属性和功能。 例子例子 Example8.java 不要将父类创建的对象和子类对象的上转型对象混淆。不要将父类创建的对象和子类对象的上转型对象混淆。子类对象子类对
31、象对象的上转型对象对象的上转型对象继承或隐藏的成员变量继承或隐藏的成员变量继承或覆盖的方法继承或覆盖的方法新增的变量新增的变量新增的方法新增的方法上转型对象的特点图上转型对象的特点图 5.15 内部类(Inner Class)内部类内部类匿名类匿名类1 内部类定义:内部类是在一个类的内部嵌套定义的类。定义:内部类是在一个类的内部嵌套定义的类。范围:范围:可以是其它类的成员可以是其它类的成员在一个语句块的内部定义在一个语句块的内部定义在表达式内部匿名定义在表达式内部匿名定义特性:特性:一般用在定义它的类或语句块之内,在外部引用它一般用在定义它的类或语句块之内,在外部引用它时必须给出时必须给出完整
32、的名称完整的名称,名字不能与包含它的类名,名字不能与包含它的类名相同。相同。内部类的特性可以声明为可以声明为abstract 、public、private、default或或protected 。内部类都是一个独立的类,编译完后的内部类都是一个独立的类,编译完后的.class文件名以文件名以“外外部类类名部类类名$内部类类名内部类类名.class”的形式出现的形式出现编译如下例子:编译如下例子: class Animal class Brain 编译生成了两个编译生成了两个.class文件:文件:Animal.class和和Animal$Brain.class ;编译器将内部类创建为一个正常
33、的顶级类,并为之命名编译器将内部类创建为一个正常的顶级类,并为之命名内部类(Inner Class)定义:内部类是在一个类的内部嵌套定义的类。定义:内部类是在一个类的内部嵌套定义的类。种类:种类:非静态内部类:作为类的成员非静态内部类:作为类的成员静态内部类:作为类的静态成员静态内部类:作为类的静态成员局部内部类:存在某个方法内部的类局部内部类:存在某个方法内部的类匿名类:存在某个类的内部,但无名称的类匿名类:存在某个类的内部,但无名称的类1.非静态内部类 非静态成员内部类作为外部类或外部接口的成员,非静态成员内部类作为外部类或外部接口的成员,不带有关键字不带有关键字static。 定义非静态
34、成员内部类等同于定义一个类的非静定义非静态成员内部类等同于定义一个类的非静态成员属性或方法态成员属性或方法 1.非静态内部类 非静态成员内部类有如下性质非静态成员内部类有如下性质 (1) 在非静态成员内部类中,如果是访问自己定义的属在非静态成员内部类中,如果是访问自己定义的属性,可以直接访问,也可以通过性,可以直接访问,也可以通过this关键字来访问。关键字来访问。 1.非静态内部类 非静态成员内部类有如下性质非静态成员内部类有如下性质 (2) 在非静态成员内部类中,可以访问外部类的所有在非静态成员内部类中,可以访问外部类的所有成员,包括成员,包括private修饰的以及修饰的以及静态成员静态
35、成员。 1.非静态内部类非静态成员内部类有如下性质非静态成员内部类有如下性质 (3) 在非静态成员内部类中,如果外部类和内部类定义的属在非静态成员内部类中,如果外部类和内部类定义的属性同名,可以通过性同名,可以通过“外部类类名外部类类名.this.外部类成员变量名外部类成员变量名”的形式来访问。的形式来访问。 1.非静态成员内部类非静态成员内部类有如下性质非静态成员内部类有如下性质 (4) 在非静态成员内部类中,不能声明静态成员。在非静态成员内部类中,不能声明静态成员。1.非静态成员内部类非静态成员内部类的实例化非静态成员内部类的实例化 只有创建了外部类对象的情况下才能创建非只有创建了外部类对
36、象的情况下才能创建非静态静态内部内部类对象类对象。 2. 静态内部类用用static修饰的内部类叫静态内部类修饰的内部类叫静态内部类静态内部类相当于是一个外部定义的类,可声明静态成员或非静态内部类相当于是一个外部定义的类,可声明静态成员或非静态成员静态成员2. 静态内部类静态内部类可以被视为顶层类的静态成员,可在不创建顶层类静态内部类可以被视为顶层类的静态成员,可在不创建顶层类对象的情况下被使用,这是与非静态内部类的区别对象的情况下被使用,这是与非静态内部类的区别2. 静态内部类静态内部类只能访问外部类的静态变量或静态方法,非静态的静态内部类只能访问外部类的静态变量或静态方法,非静态的不能访问不能访问2. 静态内部类静态内部类可以作为接口的一部分静态内部类可以作为接口的一部分3. 局部内部类局部内部类也叫方法内部类,即在方法内部定义的内部类局部内部类也叫方法内部类,即在方法内部定义的内部类不能用访问修饰符修饰,只能加不能用访问修饰符修饰,只能加final、abstract修饰修饰3. 局部内部类 局部内部类有如下性质局部内部类有如下性质 (1) 与非静态内
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论