欢迎来到三一办公! | 帮助中心 三一办公31ppt.com(应用文档模板下载平台)
三一办公
全部分类
  • 办公文档>
  • PPT模板>
  • 建筑/施工/环境>
  • 毕业设计>
  • 工程图纸>
  • 教育教学>
  • 素材源码>
  • 生活休闲>
  • 临时分类>
  • ImageVerifierCode 换一换
    首页 三一办公 > 资源分类 > PPT文档下载  

    面向对象的核心特性.ppt

    • 资源ID:6034391       资源大小:375KB        全文页数:74页
    • 资源格式: PPT        下载积分:15金币
    快捷下载 游客一键下载
    会员登录下载
    三方登录下载: 微信开放平台登录 QQ登录  
    下载资源需要15金币
    邮箱/手机:
    温馨提示:
    用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP免费专享
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    面向对象的核心特性.ppt

    Java2程序设计实用教程(第2版),第3章 类与对象,3.1 面向对象程序设计概述3.2 面向对象与UML建模3.3 Java语言与面向对象特性3.4 类的定义和对象的创建3.5 方法3.6 静态成员3.7 包3.8 成员的访问控制3.9 封装3.10 利用系统已有类,Java2程序设计实用教程(第2版),3.1面向对象程序设计概述,Java2程序设计实用教程(第2版),3.1.1面向对象术语的解释,1.对象什么是对象:现实世界中解决问题的实物(包括有行为和属性)例如:咖啡猫 黄色的(属性)爱睡觉(行为)2.类什么是类:对象的模板模板内容=类的特性(属性)+行为(方法)类的成员例如:猫类(有颜色,猫龄等属性;有睡觉,吃食等行为。,Java2程序设计实用教程(第2版),3.1 面向对象程序设计概述,类与对象关系概念:类(class)是既包括数据又包括作用于数据的一组操作的封装体。对象(object)是类的实例(instance)。,类,对象,抽象,实例化,方法,数据或变量,Java2程序设计实用教程(第2版),3.继承 什么叫继承?继承是接收来自父辈的财产在面向对象中继承的外延是什么?拥有父辈所拥有的东西 子类的继承子类拥有父辈的成员例如:汽车 继承 车/所有种类的汽车都需要实现汽车的基本功能类的继承实现了代码的重用。,Java2程序设计实用教程(第2版),4.接口 接口像一个类定义的模板,它提供了与其他事物之间相互通信的规则条目,但并非具体实现。例如:多个程序员开发同一个应用程序的不同类,约定不同类之间使用同一组方法进行通信。则创建一个接口用于定义这些方法。,Java2程序设计实用教程(第2版),5.封装 数据隐藏。成员的详细信息对 于对象外的代码是 私有的和不可见的。,数据,方法,外界,访问,Java2程序设计实用教程(第2版),3.1.2面向对象程序设计方法的优点,1可重用性2可扩展性3易于管理和维护,Java2程序设计实用教程(第2版),3.2面向对象与UML建模,建模是一项经过检验并被广为接受的工程技术。建立房屋和大厦的建筑模型,能帮助用户得到实际建筑物的印象。要生产合格的软件就要有一套关于体系的结构、过程和工具的规范。建模的目的:1.有助于按照实际情况或按照所需的样式使系统可视化2.能够规约系统的结构或行为3.给出指导系统构造的模板4.使做出的决策文档化,Java2程序设计实用教程(第2版),3.2.2UML建模语言,什么是UML?Unified Modeling Language(统一建模语言)UML是一种用来创建程序模型的图形语言(即带有语意的一种图形记号)。可以用来说明代码中对象之间的关系。,Java2程序设计实用教程(第2版),3.2.3UML进行面向对象的系统分析设计,UML进行面向对象的系统分析设计,其过程通常由以下3个部份组成。识别系统的用例和角色进行系统分析,并抽取类系统设计,并设计类及其行为,Java2程序设计实用教程(第2版),3.3 Java语言与面向对象特性,Java中的类:信息以类为单位单独封装Java中的封装:无需关心调用对象的内部细节Java中的继承:只准继承一个类,但可以“继承”多个接口。Java中的多态Java中的垃圾回收机制:自动回收垃圾内存,Java2程序设计实用教程(第2版),类的封装性、继承性和多态性类的封装性类的继承性类的多态性,数据,操作,成员变量,成员方法,类,类的封装性,访问权限,类的继承性 类的多态性,外部,Java2程序设计实用教程(第2版),类的继承性继承的概念:子类拥有父类的成员。特性:1.子类自动拥有父类全部成员(成员变量方法),人类(父),学生类(子),性别、姓名、身高、国籍,吃饭、睡觉、工作.,性别、姓名、身高、国籍,吃饭、睡觉、工作.,Java2程序设计实用教程(第2版),2.子类可以更改父类继承的成员;如学生类中,“工作”方法会有自己的限制。3.子类可以增加自己的成员;如学生类中,添加“学习”、“考试”等方法。4.子类不能删除父类任何成员。,Java2程序设计实用教程(第2版),Java的单继承,C,java,多继承:一个类有多个直接父类。可以拥有多个父类的属性或方法。,单继承:一个类只有一个直接父类,若需要继承其他方法,则通过接口实现。,注意:java中只支持单继承。即子类只有一个直接父类。多继承特点通过接口实现。,Java2程序设计实用教程(第2版),类的多态性多态:允许拥有相同的形式,但在不同情况下拥有不同机能的特性。如“”多态性方法执行的多样性重载:方法名同,参数列表不同覆盖:子类重写了父类中同名的方法。,Java2程序设计实用教程(第2版),3.4类的定义和对象的创建,程序运行可理解为做三件事:建立对象使用对象:对象之间传递消息,程序处理消息作出响应运行完毕收回对象所占空间。对象的生命周期:创建运行消亡,获得内存空间,进行各种操作,使用完释放内存,Java2程序设计实用教程(第2版),3.4.1 定义类:类声明类主体,类定义的格式:类声明 成员变量的声明;成员方法的声明及实现;,类主体,类,注意与c有何区别!变量与方法的声明与定义均不允许放在类主体外面!,class 类名 代码;,数据,方法,Java2程序设计实用教程(第2版),声明类:权限 特性 名字语法:修饰符 class 类 extends 父类 implements 接口列表,类的修饰符用来说明类的特殊性质。分为三种:访问控制符:public(公共类)、friendly(缺省类)protected(保护类)、private(私有类)多见于内嵌类)抽象类说明符:abstract最终类说明符:final,关键字,类名,表示继承哪个父类,表示继承哪些接口,Java2程序设计实用教程(第2版),例:声明一个公共类 Data1:public class Data1 定义一个公共类 人类:定义一个类 学生类:,public class Man,class Student,Java2程序设计实用教程(第2版),3.4.2类之间的关系,USES-A关系HAS-A关系IS-A关系,Java2程序设计实用教程(第2版),1.USES-A关系,类A的方法操纵了类B(对象)的成员,则称之为类A”USES-A”(用到了)类B.例3-1,轿车类(Car),其他类(Sample3_1),调用,USES-A关系,Public class Sample3_1 c.startIsEnough();,Java2程序设计实用教程(第2版),2.HAS-A关系,HAS-A关系是一种拥有关系,若类A中有B类型的成员引用变量,则类A“HAS-A”(拥有)类B.例3-2,c.getTyreInfo().getMaterial();,轿车类(Car),轮胎类(Tyre),拥有,HAS-A关系,Java2程序设计实用教程(第2版),3.IS-A关系,在面向对象中“IS-A”的概念是基于继承的,旨在表达一个类是另一个类的子类。也就是说,若类A是类B子类的一种,则可以说类A“IS-A”(是一种)类B。例如:“苹果”是“水果”的种类,class Fruit public void canEat(),class Apple,Apple a=new Apple()a.canEat();,水果,苹果,继承,IS-A关系,Java2程序设计实用教程(第2版),3.4.3构造函数,要使用对象,首先必须构造它们,并指定它们的初始状态,然后将方法应用于对象。在Java程序设计语言中,使用构造函数来构造新的实例,作用是构造并初始化对象。,Java2程序设计实用教程(第2版),构造函数的创建,创建无参构造函数 例3-3创建带参构造函数 例3-4,Java2程序设计实用教程(第2版),构造函数的特点有:,(1)构造函数的方法名与类名相同。(2)构造函数没有返回类型,也无需声明类型。(3)构造函数的主要作用是完成对类对象的初始化工作,并传递参数。(4)构造函数不能由编程人员显式地直接调用。由系统调用。(5)一个类可以定义多个构造方法,缺省构造函数为无参的默认构造函数,不执行任何代码。(6)构造方法可以重载,以参数的个数、类型或排列顺序区分。,Java2程序设计实用教程(第2版),3.3.4类成员,声明成员变量修饰符 static final transient 数据类型 变量名,访问控制符:public(公共类)friendly(缺省类)protected(保护类)private(私有类),类(静态)成员变量,常量,临时变量,类声明 成员变量的声明;成员方法的声明及实现;,Java2程序设计实用教程(第2版),例3-5:定义Student类,声明3个成员变量分别表示姓名、年龄、班级:public class Student/类声明 public String stuName;public int stuAge;public String stuClass;成员变量的引用,/声明成员变量,Java2程序设计实用教程(第2版),2.成员变量的初始值,创建对象后,如果对象有成员变量,则系统会自动为其分配一个初始值。例3-6 例3-7,注意:对象引用型成员变量,其初始值为“null”,表示此引用没有指向任何对象。,Java2程序设计实用教程(第2版),3.4.5 对象的创建,声明对象类名 对象 例:Student s;对象实例化对象=new 类的构造方法(参数列表)s=new Student();引用对象的成员变量及方法:用“.”运算符对象.成员变量对象.成员方法(参数列表)s.name=王强;/引用对象的成员变量,Student,Java2程序设计实用教程(第2版),3.5 方法,方法的定义方法的基本组成:方法的声明+方法体修饰符 static 返回值类型 方法(参数列表)throws 异常类 语句序列;return 返回值;,方法声明:,方法体:,Java2程序设计实用教程(第2版),例:int sub(int a,int b)return a-b;,int sub(int a,int b)int c;c=a-b;return c;,Java2程序设计实用教程(第2版),说明:1.参数序列指定要传递给方法什么样的信息(1)可以是java中的任何类型,包括基本数据参数类型、对象引用类型。(2)每个参数必须包括类型与变量标识符,若有多个参数,则用逗号将其分隔。如(int a,int b),Java2程序设计实用教程(第2版),2.方法体方法体是该方法具体业务代码的实现。return语句负责方法的返回。3.返回值类型返回值类型指定了该方法返回结果的类型。可以是基本数据类型或对象引用类型,没有返回值也要使用void关键字。,Java2程序设计实用教程(第2版),返回值规则:,可以在具有对象引用返回类型的方法中返回null,但基本数据类型作为返回类型则不可以返回null。对象给也是完全合法的返回值类型,如数组。在具有基本数据返回类型的方法内,可以返回任何值,只要其能够自动转换返回值类型。如返回值为double,返回整数4是可以的。但返回值为int时,返回一个浮点数12.43则 报错。一定不能在具有void返回类型的方法中返回任何内容。在具有对象引用返回类型的方法内,可以返回任何类型的对象引用,只要返回的引用与返回类型相同或可自动转换为返回类型即可。,Java2程序设计实用教程(第2版),3.5.2 方法重载,概念:同一个类中多个方法有相同的名字,不同的参数列表,这种情况称为方法重载。如:public double changeSize(int size,String name,float pattern)public void changeSize(int size,String name)private int changeSize(int size,float pattern)void changeSize(float pattern,String name)?方法返回类型不同,参数相同,算不算重载?注意:返回类型不同并不足以构成方法重载。当重载方法被调用时,编译器根据参数的类型和数量来确定实际调用哪个重载方法的版本。例3-8,Java2程序设计实用教程(第2版),方法调用进行匹配的时候,首先选择直接匹配的方法,如果没有,则将参数进行提升转换后再匹配方法,总是匹配最接近的方法。基本类型则按照基本数据类型间的自动转换关系;引用类型则寻找最能兼容传递的参数。例3-9多匹配选择示例例3-10,Java2程序设计实用教程(第2版),3.5.3递归,递归方法就是自调用方法,在方法体内直接或间接地调用自己。有两种方式:1.直接递归2.间接递归,Java2程序设计实用教程(第2版),直接递归:即在方法体内调用方法本身。例:求斐波那数列第n项 斐波那数列:f(0)=f(1)=1 f(n)=f(n-1)+f(n-2)(n1)例3-11,Java2程序设计实用教程(第2版),间接递归:函数中调用其他函数,其他函数又调用本函数。例3-12,Java2程序设计实用教程(第2版),3.6静态成员,静态修饰符static,修饰类中的静态属性和方法,(1)静态属性被static修饰的属性称为静态属性(类属性)。特点:它们是类的属性,而不属于任何一个类的具体对象。即在一个类中只能有一个这类字段,并且由类调用,无需引用任何对象。(2)静态方法被static修饰的方法成为静态方法(类方法)。特点:不与任何对象相关联。能够在它的类的任何对象访问前辈访问,即使没有对象也能调用该方法。静态方法只能调用静态属性。,Java2程序设计实用教程(第2版),例:public class StaticDemo public static String s=“我是静态变量”public static void printInfo()System.out.println(“我是静态方法”);,问?在其他类中如何调用静态变量和方法?例3-13,Java2程序设计实用教程(第2版),3.6.2静态变量与常量,在java中,表示常量的方法是通过静态成员变量的方式来实现的:如:声明3个常量X,Y,Z:public static final int X=10;public static final int Y=20;public static final int Z=40;“public static final”相当于表示常量的修饰符。,公共的,即所有对象都能够访问。,静态的,即无需创建任何对象直接可通过类调用。,最终的,即定义的值为永久的,不能改变。,Java2程序设计实用教程(第2版),静态属性的初始化,静态成员变量的初始化要求在静态语句块结束之前必须完成。一方面可以在声明的同时进行初始化,另一方面可以在静态语句块中进行初始化。例3-4,Java2程序设计实用教程(第2版),3.6.3静态成员的访问,.例3-151.静态方法访问非静态成员,静态成员生命周期比非静态要长,当访问静态成员时,非静态成员不一定存在,因此静态方法不能访问非静态属性。同样道理,静态方法不能使用this预定对象关键字。,Java2程序设计实用教程(第2版),例3-16 静态方法访问非静态成员示例1例3-17 静态方法访问非静态成员示例2,Java2程序设计实用教程(第2版),2.非静态方法访问静态成员非静态方法产生时,静态成员已经存在。因此静态方法在任何时候都可以访问静态成员。例3-18,Java2程序设计实用教程(第2版),3.6.4main方法,Main方法特殊的静态方法,作为程序的入口,由于不对任何对象施加操作(实为执行时还无任何对象产生),因此声明为static;该方法由虚拟机调用,所以必须为public;而方法不需要返回值,因此声明为void。声明:public static void main(String args)例3-19,Main方法规定有一个类型为String的入参,取名为args。用于接收命令行输入的参数。,Java2程序设计实用教程(第2版),3.6.5 Factory方法,Java的静态方法有一种常见的用途,就是使用Factory方法产生不同风格的对象,例如NumberFormat类使用Factory方法产生不同风格的格式对象。Factory Method是最常用的模式了,Factory方法在Java程序系统中可以说是随处可见。Factory方法就相当于创建实例对象的new,我们经常要根据类Class生成实例对象,如A a=new A(),Factory Method也是用来创建实例对象的,所以以后new时可以考虑实用factory模式(工厂模式),虽然这样做,可能多做一些工作,但会给系统带来更大的可扩展性和尽量少的修改量。,Java2程序设计实用教程(第2版),Factory作用:完成复杂情况下的初始化工作。尽量将长的代码分派“切割”成每段,将每段再“封装”起来。这样就需要将创建实例的工作与使用实例的工作分开,也就是说,让创建实例所需要的大量初始化工作从构造函数中分离出去。这时我们就需要Factory工厂模式来生成对象了。使用工厂方法要注意几个角色,首先要定义产品接口,如Fruit,产品接口下有接口的实现类,如Apple,其次要有一个factory类,用来生成产品。例Factory方法实例:例3-20,Java2程序设计实用教程(第2版),3.7 包,概念:包是一种将相关类,接口或其他包组织起来的集合体。目的:用来管理类名空间,将包含类代码的文件组织起来,易于查找和使用,避免同名类发生冲突。内容:类,接口及其他包。说明:包是一种松散的类集合,一般在不要求处于同一个包中的类有明确的相互关系,但是由于同一包的类在默认情况下可以互相访问,因此常把需要在一起工作的类放在一个包里。包也称类库,Java2程序设计实用教程(第2版),3.7.1 包的定义,(1)缺省情况下为无名包(2)有名包的创建:使用package语句如:package pname;3-13或 package dir1.dir2.pname;包就是一个文件夹,里面存放该程序所生成的所有.class文件,包中的“.”号表示子文件夹。默认包中类之间可以相互访问public,protected或默认访问权限的数据成员和成员函数。默认包中的类不能被其他包中的类引用。,Java2程序设计实用教程(第2版),package语句必须放在源文件最前面,之前不可以有其他任何语句;每个源文件最多只能有一条package语句。例3-21 将类Sample3_21放至包chapter03的sample3_21中。,Java2程序设计实用教程(第2版),JDK环境下包中类的编译和运行,编译时:javac运行:d:javajava,d CLASSPATH路径 Myclass.java CLASSPATH变量指明包存放的位置。例如:javac d d:java Sample3_21.java结果:直接在d:java下创建在myclass.java指明的包目录,并把Myclass.class拷到该目录下。,包名.myclass,例如:java,Java2程序设计实用教程(第2版),3.7.2 类的导入,(1)加载引用(类短名)使用import语句或 import mypack1.mypack2.*注意:1.Import语句必须先于所有类声明。2.使用(*)只能表示本层次的所有类,而不包括子层次下的类。如 import java.awt.*;import java.awt.event.*;/上面的语句未包括event 子包中的类3.用(*)一般适用于要用到同个包当中的多个类的情况。,Java2程序设计实用教程(第2版),(2)类长名:直接使用包名、类名前缀(用在语句中)例如:d1=new java.util.Date(),Java2程序设计实用教程(第2版),(3)直接引用:在同一文件夹下(私有类除外)将无名包中的引用类与被引用类存贮在同一物理空间 例如:假如Car和Sample3_3这两个类在向一个目录下,你就可以在Sample3_3类中创建一个Car实例,无需导入Car这个类。,Java2程序设计实用教程(第2版),注意:java中java.lang包中的类系统是自动引入的,即使不用import语句,每个源文件中系统编译时都会自动引入java.lang.*中的类。,Java2程序设计实用教程(第2版),两种特殊情况需要注意:1.两个包中有同名类,但只用到其中一个及其他不同名的类,则在import语句中明确给出需要引用的类名。如例3-222.两个包中有同名类,且都要使用,则直接在语句中指明调用哪个类。如例3-23,Java2程序设计实用教程(第2版),3.7.3静态导入,从Java SE 5.0开始,导入语句不但可以导入类,还具有导入静态方法和静态成员变量的功能,不过需要在关键字“import”和包名之间添加关键字“static”,语法如下。import static.*;import static.;“*”还是代表通配符,不过这里表示的是指定类下面所有静态的方法或成员变量。如果要明确指明要使用的方法或成员变量,用第2行语法。碰到不同类下同名静态方法或成员变量时,解决冲突的方法类似上一小节,这里不再赘述。,Java2程序设计实用教程(第2版),3.8成员的访问控制,成员的访问是指以下两种不同的操作:一个类中的方法代码是否能够调用(调用)另一个类中的成员。一个类是否能够继承其父类的成员。,Java2程序设计实用教程(第2版),所有类A,所有子类C,同包中类B 包中子 类E,本类D,访问控制符:,Java2程序设计实用教程(第2版),公共类型:public 例3-26私有类型:private 例3-27默认类型:default 例3-28保护类型:protected,Java2程序设计实用教程(第2版),封装是一个面向对象的术语,其含义很简单,就是把东西包装起来。换言之,成员变量和方法的定义都包装于类定义之中,类定义可以看成是将构成类的成员变量和方法封装起来。通过限定类成员的可见性,可以使类成员中的某些属性和方法能够不被程序的其他部分访问,它们被隐藏了起来,只能在定义的类中使用,这就是面向对象中实现封装的方式。,3.9封 装,成员变量,成员方法,类,外部,Java2程序设计实用教程(第2版),Java中封装需要遵循的规则:用访问限制修饰符保护成员变量,通常是private。建立公有的public访问方法,强制调用代码通过这些方法访问成员变量,而不是直接调用。例3-29,Java2程序设计实用教程(第2版),分析:width和height成员变量被封装,必须通过setProerty方法才能访问,由于在setProerty方法中设置了检验值正确性的规则,所以不可能设置错误的width和height值,增加代码的健壮性。封装后不但可以提高健壮性,还可以提高灵活性,例如,若因需要将height或width的值改为String类型,如果没有封装,代码一旦修改,则所有调用该值的代码都需要更改;而封装后只需要修改设置成员值的方法,将变化限制在一个较小的范围内,使外界无需做任何改变仍能继续调用。例3-30,Java2程序设计实用教程(第2版),3.10 利用系统已有的类,通过前面几节的介绍,读者已经对类的定义及对象的创建与使用有了一定的了解。本节将介绍Java类库中提供的几个常用的处理日期时间的类。通过对这几个类的介绍,使读者了解利用系统已有的类的思想。,Java2程序设计实用教程(第2版),3.10.1 Date类,在标准Java类库中包含一个Date类,其对象用来描述一个时间点,如“September 22,2007,23:59:59 GMT”。在使用Date类时要在代码的开始添加“import java.util.Date”,这里可以理解为将其导入的意思,下一章将详细介绍此语句的功能和用法。Date类与前面第3章介绍的Math类不同,在开发中不是访问类的静态方法,而是要使用其对象,可以用如下代码创建Date对象:new Date();/创建当前系统日期的Date对象new Date(106,11,8);/创建2006.12.8日期对象,Java2程序设计实用教程(第2版),Date常用方法,打印系统时间:System.out.println(new Date();判断此日期是否比when日期晚:boolean after(Date when)如:today.after(birthday)判断此日期是否比when日期早:boolean before(Date when)如:today.before(birthday)提取时间的方法 表3-3 例3-31,Java2程序设计实用教程(第2版),3.10.2 GregorianCalendar类,上小节中介绍的Date类,主要的功能是储存时间点的信息,而对日期/时间的处理功能并不强大。其记录的时间是距离一个固定时间点的秒数(可正可负),这个固定时间点是UTC时间1970年1月1日00:00:00(UTC即协调世界时间,是Coodinated Universal Time的缩写,与GMT一样是一种国际标准时间)。虽然Date类可以打印出类似于“February 17,2007,23:59:59 GMT”这样的日期表示形式,但此形式只是公历的表示方式,若需采用中国的农历表示日期,Date类就无能为力了。,Java2程序设计实用教程(第2版),GregorianCalendar使用方法,创建当前时间对象:New GregorianCalendar();创建对象时为其设置日期:New GregorianCalendar(2007,1,17)使用常量创建日期对象:New GregorianCalendar(2007,Calendar.FEBRUAY,17)创建对象同时给出具体时间信息:New GregorianCalendar(2007,Calendar.FEBRUAY,17,18,15,23)GregorianCalendar常用方法 表3-4例 3-32,Java2程序设计实用教程(第2版),3.11 小结,本章简单介绍了面向对象的思想,并详细介绍了类的定义及其使用,访问控制和封装,最后通过对系统中提供的几个类的介绍阐述了利用系统已有类的思想。通过本章的学习,读者可以构造出自己的类,通过这些类的对象的相互协作,便能开发出具有一定功能的应用程序。,

    注意事项

    本文(面向对象的核心特性.ppt)为本站会员(小飞机)主动上传,三一办公仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知三一办公(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    备案号:宁ICP备20000045号-2

    经营许可证:宁B2-20210002

    宁公网安备 64010402000987号

    三一办公
    收起
    展开