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

    java语言程序设计第2章.ppt

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

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

    java语言程序设计第2章.ppt

    1,第二章类与对象的基本概念,JAVA语言程序设计,2,目录,2.1 面向对象的程序设计方法概述2.2 类与对象 2.3 对象初始化和回收 2.4 应用举例 2.5 UML简介2.6 本章小节,3,2.1 面向对象的程序设计方法概述,面向对象的程序设计 四大重要特征抽象封装继承多态,4,对象万物皆对象。两大构成要素:属性(数据)、行为(方法)类将属性及行为相同或相似的对象抽象为类对象是类的实例,面向对象程序设计方法概述,2.1 面向对象的程序设计方法概述(续),5,例:钟表数据(属性)int Hour;int Minute;int Second;方法(行为)SetTime();ShowTime();,面向对象程序设计方法概述,6,例:人数据(属性)char*name;char*gender;int age;int id;方法(行为)生物行为Eat(),Step(),社会行为Work(),Study(),面向对象程序设计方法概述,7,2.2.1 类的声明,声明形式public abstract|final class 类名称 extends 父类名称 implements 接口名称列表 成员变量(属性);成员方法(行为);,类与对象,8,关键字Class表明其后声明的是一个类。extends如果所声明的类是从某一父类派生而来,那么,父类的名字应写在extends之后implements如果所声明的类要实现某些接口,那么,接口的名字应写在implements之后,2.2.1 类的声明(续),类与对象,9,修饰符可以有多个,用来限定类的使用方式public表明此类为公有类abstract指明此类为抽象类final指明此类为终结类 类声明体变量成员声明及初始化可以有多个方法声明及方法体可以有多个,2.2.1 类的声明(续),类与对象,10,钟表类public class Clock/成员变量(属性)int hour;int minute;int second;/成员方法(行为)public void setTime(int newH,int newM,int newS)hour=newH;minute=newM;second=news;public void showTime()System.out.println(hour+:+minute+:+second);,2.2.1 类的声明(续)例2_1,类与对象,11,变量和对象变量除了存储基本数据类型的数据,还能存储对象的引用,用来存储对象引用的变量称为引用变量类的对象也称为类的实例,2.2.2 对象的声明与引用,类与对象,12,对象的声明格式类名 变量名:Clock aclock;声明一对象时并没有开辟内存空间,2.2.2 对象的声明与引用(续),类与对象,13,对象的创建生成实例的格式:new()例如:aclock=new Clock()其作用是:在内存中为此对象分配内存空间对象可以被赋以空值例如:aclock=null;,2.2.2 对象的声明与引用(续),类与对象,14,2.2.3 数据成员(成员变量),成员变量分为实例变量和类变量,类与对象,15,声明格式public|protected|private static finaltransient volatile变量数据类型 变量名1=变量初值,变量名2=变量初值,;格式说明public、protected、private 为访问控制符static指明这是一个静态成员变量final指明变量的值不能被修改transient指明变量是临时状态volatile指明变量是一个共享变量,2.2.3 数据成员(续),类 与 对 象,16,实例变量没有static修饰的变量称为实例变量用来存储对象需要的属性信息,不同对象属性值可能会不同可通过下面的表达式访问对象属性的值.,2.2.3 数据成员(续)实例变量,类与对象,17,声明一个表示圆的类,保存在文件Circle.java 中。然后编写测试类,保存在文件ShapeTester.java中,并与Circle.java放在相同的目录下public class Circle int radius;public class ShapeTester public static void main(String args)Circle x;x=new Circle();System.out.println(x);System.out.println(radius=+x.radius);,2.2.3 数据成员(续)例2_2,类与对象,18,编译后运行结果如下:Circle26b249radius=0解释之后的数值为x所指的对象的存储地址x的值及对象的状态如图,2.2.3 数据成员(续)例2_2运行结果,类与对象,19,将两个文件合并为ShapeTester.java。注意:一个文件中只能有一个public 类,该类中可以包含main函数,且文件名与该类名相同。class Circle int radius;public class ShapeTester public static void main(String args)Circle x;x=new Circle();System.out.println(x);System.out.println(radius=+x.radius);,20,声明一个表示矩形的类,保存在Rectangle.java中;编写测试类,保存在ShapeTester.java中,二文件保存在相同的目录下public class Rectangle double width=10.128;double height=5.734;public class ShapeTester public static void main(String args)Circle x;Rectangle y;x=new Circle();y=new Rectangle();System.out.println(x+y);,2.2.3 数据成员(续)例2_3,类与对象,21,编译后运行结果如下:Circle82f0db Rectangle92d342解释Circle及Rectangle类对象的状态如图,2.2.3 数据成员(续)例2_3运行结果,类与对象,22,对ShapeTester类进行修改,使两个实例具有不同的实例变量值public class ShapeTester public static void main(String args)Circle x;Rectangle y,z;x=new Circle();y=new Rectangle();z=new Rectangle();x.radius=50;z.width=68.94;z.height=47.54;System.out.println(x.radius+y.width+z.width);,2.2.3 数据成员(续)例2_3修改,类与对象,23,编译后运行结果如下:50 10.128 68.94解释Circle及Rectangle类对象的状态如图,2.2.3 数据成员(续)修改后运行结果,类与对象,24,地址簿程序一个人的地址通常包括以下信息:姓名,省份,城市,街道,门牌号,邮政编码采用过程化的程序设计方法,使用简单变量存储,则存储两个人地址的代码如下,2.2.3 数据成员(续)例2_4,类与对象,25,public static void main(String args)String name1,name2;int gateNumber1,gateNumber2;String streetName1,streetName2;String city1,city2;String province1,province2;String postalCode1,postalCode2;name1=Zhang Li;gateNumber1=15;streetName1=Tsinghua East Road;city1=Beijing;province1=“Beijing;postalCode1=100084;name2=Li Hong;gateNumber2=2;streetName2=BeiNong;city2=Beijing;province2=Beijing;postalCode2=102206;/.do something interesting,2.2.3 数据成员(续)例2_4,类与对象,26,采用面向对象的程序设计方法,则需要首先声明Address类如下public class Address String name;int gateNumber;String streetName;String city;String province;String postalCode;/方法成员略,2.2.3 数据成员(续)例2_4,类与对象,27,主方法改写如下public static void main(String args)Address address1=new Address(),address2=new Address();address1.name=“Zhang Li;address1.streetNumber=15;address1.streetName=“Tsinghua East Road;address1.city=“Beijing;address1.province=“Beijing;address1.postalCode=“100084;address2.name=“Li Hong;address2.streetNumber=2;address2.streetName=“BeiNong;address2.city=“Beijing;address2.province=“Beijing;address2.postalCode=“102206;/.do something interesting,2.2.3 数据成员(续)例2_4,类与对象,28,类变量也称为静态变量,声明时需加static修饰符不管类的对象有多少,类变量只存在一份。被所有对象共享。引用格式.,2.2.3 数据成员(续)类变量,类与对象,29,对于一个圆类的所有对象,计算圆的面积时,都需用到的值,可在Circle类的声明中增加一个类属性PIpublic class Circle static double PI=3.14159265;int radius;当我们生成Circle类的对象时,在每一个对象中并没有存储PI的值,PI的值存储在类中,2.2.3 数据成员(续)例2_5,类与对象,30,对类变量进行测试public class ClassVariableTester public static void main(String args)Circle x=new Circle();System.out.println(x.PI);System.out.println(Circle.PI);Circle.PI=3.14;System.out.println(x.PI);System.out.println(Circle.PI);测试结果3.141592653.141592653.143.14,2.2.3 数据成员(续)例2_5运行结果,类与对象,31,声明一个Point类,有两个私有变量保存点坐标,一个类变量保存已有点的个数public class Point private int x;private int y;public static int pointCount=0;public Point(int x,int y)this.x=x;this.y=y;pointCount+;,2.2.3 数据成员(续)Point.java,类与对象,32,测试类ex2_4class ex2_4 public static void main(String args)Point p=new Point(1,1);System.out.println(p.pointCount);Point q=new Point(2,2);System.out.println(q.pointCount);System.out.println(q.pointCount=Point.pointCount);System.out.println(Point.pointCount);,2.2.3 数据成员(续)Point类测试,类与对象,33,测试结果12true2,2.2.3 数据成员(续)Point类测试结果,类与对象,34,实例变量和类变量都可被声明为finalfinal实例变量必须在每个构造方法结束之前赋初值,以保证使用之前会被初始化final类变量必须在声明的同时初始化,2.2.3 数据成员(续)final修饰符,类与对象,35,2.2.4 方法成员(成员方法),成员方法定义类的行为一个对象能够做的事情我们能够从一个对象取得的信息可以没有,也可以有多个;一旦在类中声明了方法,它就成为了类声明的一部分分为实例方法和类方法,类与对象,36,声明格式public|protected|private static finalabstract native synchronized返回类型 方法名(参数列表)throws exceptionList方法体,2.2.4 方法成员(续)声明格式,类与对象,37,格式说明方法修饰public、protected、private 为存取控制符static指明方法是一个类方法final指明方法是一个终结方法abstract指明方法是一个抽象方法native用来集成java代码和其它语言的代码synchronized用来控制多个并发线程对共享数据的访问,2.2.4 方法成员(续)格式说明,类与对象,38,格式说明(续)返回类型方法返回值的类型,可以是任意的Java数据类型当不需要返回值时,返回类型为void参数类型简单数据类型,引用类型(数组、类或接口)可以有多个参数,也可以没有参数,方法声明时的参数称为形式参数方法体方法的实现包括局部变量的声明以及所有合法的Java指令局部变量的作用域只在该方法内部throws exceptionList用来处理异常,2.2.4 方法成员(续)格式说明,类与对象,39,方法调用调用格式.(参数列表)参数传递值传递:参数类型为基本数据类型时引用传递:参数类型为对象类型或数组时,2.2.4 方法成员(续)方法调用,类与对象,40,实例方法表示特定对象的行为声明时前面不加static修饰符,2.2.4 方法成员(续)实例方法,类与对象,41,在Circle类中声明计算周长的方法 public class Circle static double PI=3.14159265;int radius;public double circumference()return 2*PI*radius;由于radius是实例变量,在程序运行时,Java会自动取对象的属性值,2.2.4 方法成员(续)例2_6,类与对象,42,方法调用测试public class CircumferenceTester public static void main(String args)Circle c1=new Circle();c1.radius=50;Circle c2=new Circle();c2.radius=10;double circum1=c1.circumference();double circum2=c2.circumference();(Circle 1 has circumference+circum1);(Circle 2 has circumference+circum2);,2.2.4 方法成员(续)例2_6,类与对象,43,运行结果Circle 1 has circumference 314.159265Circle 2 has circumference 62.831853说明在使用实例方法时,需要将其发送给一个实例对象(也称给对象发送一条消息),radius的值即是接收者对象的值在执行c1.circumference()时,radius的值为c1的radius属性值;在执行c2.circumference()时,radius的值为c2的radius属性值,类与对象,2.2.4 方法成员(续)例2_6运行结果,44,在Circle类及Rectangle类中声明计算面积的方法area(),2.2.4 方法成员(续)例2_7,public class Circle static double PI=3.14159265;int radius;public double circumference()return 2*PI*radius;public double area()return PI*radius*radius;,public class Rectangle double width;double height;public double area()return width*height;,类与对象,45,声明测试类,对Circle类及Rectangle类的area()方法进行测试 public class AreaTester public static void main(String args)Circle c=new Circle();c.radius=50;Rectangle r=new Rectangle();r.width=20;r.height=30;System.out.println(Circle has area+c.area();System.out.println(Rectangle has area+r.area();,类与对象,2.2.4 方法成员(续)例2_7,46,运行结果Circle has area 7853.981625Rectangle has area 600.0说明不同的类中可以声明相同方法名的方法使用时,系统会根据接收者对象的类型找到相应类的方法,2.2.4 方法成员(续)例2_7运行结果,类与对象,47,带参数的方法举例:在Circle类中增加方法改变圆的半径public class Circle static double PI=3.14159265;int radius;public double circumference()return 2*PI*radius;public double area()return PI*radius*radius;public void enlarge(int factor)radius=radius*factor;,2.2.4 方法成员(续)例2_8,类与对象,48,测试类public class EnlargeTester public static void main(String args)Circle c1=new Circle();c1.radius=50;Circle c2=new Circle();c2.radius=10;System.out.println(Circle 1 的周长:+c1.circumference();System.out.println(Circle 2 的周长:+c2.circumference();c2.enlarge(4);System.out.println(Circle 2 扩大后的周长:+c2.circumference();,2.2.4 方法成员(续)例2_8,类与对象,49,运行结果Circle 1 的周长:314.159265Circle 2 的周长:62.831853Circle 2 扩大后的周长:251.327412,2.2.4 方法成员(续)例2_8运行结果,类与对象,50,以对象作为参数的方法举例:在Circle类中增加fitsInside方法判断一个圆是否在一个长方形内,需要以Rectangle类的对象作为参数public class Circle static double PI=3.14159265;int radius;public double circumference()return 2*PI*radius;public void enlarge(int factor)radius=radius*factor;public boolean fitsInside(Rectangle r)return(2*radius r.width),2.2.4 方法成员(续)例2_9,类与对象,51,测试类 public class InsideTester public static void main(String args)Circle c1=new Circle();c1.radius=8;Circle c2=new Circle();c2.radius=15;Rectangle r=new Rectangle();r.width=20;r.height=30;System.out.println(Circle 1 fits inside Rectangle:+c1.fitsInside(r);System.out.println(Circle 2 fits inside Rectangle:+c2.fitsInside(r);,2.2.4 方法成员(续)例2_9,类与对象,52,运行结果Circle 1 fits inside Rectangle:trueCircle 2 fits inside Rectangle:false,2.2.4 方法成员(续)例2_9运行结果,类与对象,53,类方法也称为静态方法,表示类中对象的共有行为声明时前面需加static修饰符类方法可以在不建立对象的情况下用类名直接调用,也可用类实例调用,2.2.4 方法成员(续)类方法,类与对象,54,将摄氏温度(centigrade)转换成华氏温度(fahrenheit)转换公式为 fahrenheit=centigrade*9/5+32除了摄氏温度值及公式中需要的常量值,此功能不依赖于具体的类实例的属性值,因此可声明为类方法转换方法centigradeToFahrenheit放在类Converter中public class Converter public static int centigradeToFahrenheit(int cent)return(cent*9/5+32);方法调用Converter.centigradeToFahrenheit(40),2.2.4 方法成员(续)例2_10,类与对象,55,包是一组类的集合(以src为例)一个包可以包含若干个类文件,还可包含若干个包包的作用将相关的源代码文件组织在一起类名的空间管理,利用包来划分名字空间,便可以避免类名冲突提供包一级的封装及存取权限,2.2.5 类的组织包的概念,类与对象,56,包的声明命名的包(Named Packages)例如:package Mypackage;(程序文件中需要包含所在包的声明,而且必须是第一条语句)默认包(未命名的包)不含有包声明的编译单元是默认包的一部分,2.2.5 类的组织包的概念(续),类与对象,57,引入包 为了使用其它包中所提供的类,需要使用import语句引入所需要的类Java编译器为所有程序自动引入包java.langimport语句的格式 import package1.package2.(classname|*);其中package1.package2表明包的层次,它对应于文件目录classname则指明所要引入的类名如果要引入一个包中的所有类,则可以使用星号(*)来代替类名,类与对象,2.2.5 类的组织包的概念(续),58,类的访问控制类的访问控制只有public(公共类)及无修饰符(缺省类)两种访问权限符与访问能力之间的关系如表,类与对象,2.2.6 类的访问控制,59,类成员的访问控制公有(public)可以被其他任何对象访问(前提是对类成员所在的类有访问权限)保护(protected)只可被同一类及其子类的实例对象访问私有(private)只能被这个类本身访问,在类外不可见默认(default)仅允许同一个包内的访问;又被称为“包(package)访问权限”,2.2.6 类成员的访问控制,类与对象,60,2.2.6 类成员的访问控制(续),类与对象,61,对例2-6中的Circle类声明进行修改,给实例变量加上private修饰符public class Circle static double PI=3.14159265;private int radius;public double circumference()return 2*PI*radius;,2.2.6 类成员的访问控制(续)例2_11,类与对象,62,再编译CircumferenceTester.javapublic class CircumferenceTester public static void main(String args)Circle c1=new Circle();c1.radius=50;Circle c2=new Circle();c2.radius=10;double circum1=c1.circumference();double circum2=c2.circumference();(Circle 1 has circumference+circum1);(Circle 2 has circumference+circum2);,2.2.6 类成员的访问控制(续)例2_11,类与对象,63,编译时会提示出错在编译语句“c1.radius=50;”及“c2.radius=10;”时会提示存在语法错误“radius has private access in Circle”说明由于在Circle类声明中变量radius被声明为private,因此在其它类中不能直接对radius进行存取如果要允许其它类访问radius的值,就需要在Circle类中声明相应的公有方法。通常有两类典型的方法用于访问属性值,get方法及set方法,2.2.6 类成员的访问控制(续)例2_11编译,类与对象,64,get方法功能是取得属性变量的值get方法名以“get”开头,后面是实例变量的名字一般具有以下格式:public get()return;对于实例变量radius,声明其get方法如下:public int getRadius()return radius;,2.2.6 类成员的访问控制(续)get方法,类与对象,65,set方法功能是修改属性变量的值set方法名以“set”开头,后面是实例变量的名字一般具有以下格式public void set()=;声明实例变量radius的set方法如下:public void setRadius(int r)radius=r;,2.2.6 类成员的访问控制(续)set方法,类与对象,66,关键字this的使用如果形式参数名与实例变量名相同,则需要在实例变量名之前加this关键字,否则系统会将实例变量当成形式参数。在上面的set方法中,如果形式参数为radius,则需要在成员变量radius之前加上关键字this。代码如下:public void setRadius(int radius)this.radius=radius;,2.2.6 类成员的访问控制(续)set方法,类与对象,67,2.3 对象初始化和回收,对象初始化系统在生成对象时,会为对象分配内存空间,并自动调用构造方法对实例变量进行初始化对象回收对象不再使用时,系统会调用垃圾回收程序将其占用的内存回收,68,2.3.1 构造方法,构造方法一种和类同名的特殊方法,用来初始化对象通常被声明为公有的(public),没有返回类型,修饰符void也不能有.没有定义构造方法的类,系统自动提供默认的构造方法.,对象初始化和回收,69,系统提供的默认构造方法如果没有声明构造方法,则系统提供一个默认的,该方法将对象中的成员变量赋空值或零。默认的构造方法没有参数,其方法体为空,对象初始化和回收,2.3.1 构造方法(续)默认构造方法,70,声明一个银行帐号类及测试代码public class BankAccountString ownerName;int accountNumber;float balance;public class BankTester public static void main(String args)BankAccount myAccount=new BankAccount();System.out.println(ownerName=+myAccount.ownerName);System.out.println(accountNumber=+myAccount.accountNumber);System.out.println(balance=+myAccount.balance);,2.3.1 构造方法(续)例2_12(使用默认构造方法),对象初始化和回收,71,运行结果ownerName=nullaccountNumber=0balance=0.0,对象初始化和回收,2.3.1 构造方法(续)例2_12运行结果,72,自定义构造方法与方法重载可在生成对象时给构造方法传送初始值,使用希望的值给对象初始化.构造方法可以被重载,构造方法的重载和方法的重载一致一个类中有两个及以上同名的方法,但参数表不同,这种情况就被称为方法重载。,对象初始化和回收,2.3.1 构造方法(续)自定义构造方法,73,为BankAccount声明一个有三个参数的构造方法public BankAccount(String initName,int initAccountNumber,float initBalance)ownerName=initName;accountNumber=initAccountNumber;balance=initBalance;BankAccount myAccount=new BankAccount(“Lucy”,30,2500.0);假设一个新帐号的初始余额可以为0,则可增加一个带有两个参数的构造方法public BankAccount(String initName,int initAccountNumber)ownerName=initName;accountNumber=initAccountNumber;balance=0.0f;BankAccount myAccount=new BankAccount(“LiLi”,29);,对象初始化和回收,2.3.1 构造方法(续)例2_13,74,自定义无参的构造方法在声明构造方法时,好的声明习惯是不声明构造方法如果声明,至少声明一个无参构造方法,对象初始化和回收,2.3.1 构造方法(续)自定义无参构造方法,75,构建一个Bush类,有两个有参数的构造方法class Bush Bush(int i)Bush(double d)如果写:new Bush();编译器将要告诉你找不到对应的构造方法说明用户在进行类声明时,如果没有声明任何构造方法,系统会赋给此类一个默认(无参)的构造方法。但是,只要用户声明了构造方法,即使没有声明无参的构造方法,系统也不再赋默认的构造方法,2.3.1 构造方法(续)Bush.java,对象初始化和回收,76,在例2_13基础上再声明一个无参的构造方法public BankAccount()ownerName=;accountNumber=999999;balance=0.0f;,对象初始化和回收,2.3.1 构造方法(续)例2_14,77,创建一个拥有两个构造方法的Tree类,一个有参,一个无参。import java.util.*;class Tree int height;Tree()prt(Planting a seedling);height=0;Tree(int i)prt(Creating new Tree that is+i+feet tall);height=i;void info()prt(Tree is+height+feet tall);void info(String s)prt(s+:Tree is+height+feet tall);static void prt(String s)System.out.println(s);,2.3.1 构造方法(续)Tree.java,对象初始化和回收,78,测试Tree类public class Overloading public static void main(String args)for(int i=0;i 5;i+)Tree t=new Tree(i);t.info();t.info(overloaded method);new Tree();,2.3.1 构造方法(续)Overloading.java,对象初始化和回收,79,测试结果Creating new Tree that is 0 feet tallTree is 0 feet talloverloaded method:Tree is 0 feet tallCreating new Tree that is 1 feet tallTree is 1 feet talloverloaded method:Tree is 1 feet tallCreating new Tree that is 2 feet tallTree is 2 feet talloverloaded method:Tree is 2 feet tallCreating new Tree that is 3 feet tallTree is 3 feet talloverloaded method:Tree is 3 feet tallCreating new Tree that is 4 feet tallTree is 4 feet talloverloaded method:Tree is 4 feet tallPlanting a seedling,2.3.1 构造方法(续)Overloading测试结果,对象初始化和回收,80,this关键字的使用可以使用this关键字在一个构造方法中调用另外的构造方法通常用参数个数比较少的构造方法调用参数个数最多的构造方法,2.3.1 构造方法(续)this关键字的使用,对象初始化和回收,81,使用this关键字,修改BankAccout类中无参数和二参数的构造方法,对象初始化和回收,public BankAccount()this(,999999,0.0f);public BankAccount(String initName,int initAccountNumber)this(initName,initAccountNumber,0.0f);public BankAccount(String initName,int initAccountNumber,float initBalance)ownerName=initName;accountNumber=initAccountNumber;balance=initBalance;,2.3.1 构造方法(续)BankAccount.java,82,内存回收技术当一个对象在程序中不再被使用时,就成为一个无用对象当前的代码段不属于对象的作用域把对象的引用赋值为空Java运行时系统通过垃圾收集器周期性地释放无用对象所使用的内存Jav

    注意事项

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

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




    备案号:宁ICP备20000045号-2

    经营许可证:宁B2-20210002

    宁公网安备 64010402000987号

    三一办公
    收起
    展开