第五章 Java类的继承、包及接口

合集下载

第5章 Java中的面向对象特性

第5章  Java中的面向对象特性

堆内存 代码区 public class Person { static int id; int age = 20; public static void main(String[] args) {… } } id age
Zhangsan.id
Zhangsan.age lisi.id
lisi.age
例2: 五子棋

面向过程:
1、开始游戏, 2、黑子先走, 3、绘制画面, 4、判断输赢, 5、轮到白子, 6、绘制画面, 7、判断输赢, 8、返回步骤2, 9、输出最后结果。

面向对象:
1、黑白双方 --这两方的行为是一模一样的, 2、棋盘系统 --负责绘制画面, 3、规则系统 --负责判定诸如犯规、输赢等。
a product
1.2 ×× 1.728 ×× 1.2
参数传递方式 值传递方式
方式:方法调用时,为形参分配单元,并将实参的值复制到形参
中;调用结束,形参单元被释放,实参单元仍保留并维持原 值 特点: 形参与实参占用不同的内存单元 单向传递
Person zhangSan=new Person(“张三”,18,“男”);
zhangSan
0xabcd
张三 null
name sex age
0 18
栈内存 实体的内存地址
男 0
堆内存
使用new 运算符和类的构造方法为声明 的对象分配内存,如果类中没有构造方法, 系统会调用默认的构造方法,默认的构造方 法是无参数的。
事万物皆对象”。 对象可以看成是静态属性(成员变量)和动态属 性(方法)的封装体。 类是用来创建同一类型的对象的“模板”,在 一个类中定义了该类对象所应具有的成员变量 以及方法。 移J2SDK提供了很多类供编程人员使用,编程 人员也可定义自己的类。

java语言的类间的继承关系

java语言的类间的继承关系

java语言的类间的继承关系1. 前言Java语言作为一门面向对象编程(OO)语言,其中最重要的特性之一是继承(Inheritance)。

继承使得一个类可以从另一个类中继承其特征,使得代码复用变得更加高效。

本文旨在介绍Java语言中类间的继承关系,从什么是继承开始,到如何在代码中使用继承,包括继承的类型、继承的规则和优缺点等。

2. 什么是继承继承(Inheritance)可以定义为一个类(子类)继承属性和方法的过程,这些属性和方法是已经存在于另一个类(父类)中的。

子类可以从父类继承其属性和方法,同时还可以添加自己的属性和方法。

在Java语言中,继承关系是一种“is-a”(是一个)关系,例如:“狗”是“动物”的一种,因此可以定义一个“狗”类,使其继承“动物”类的属性和方法。

3. 继承的类型Java语言中,有两种类型的继承,分别是类继承和接口继承。

3.1 类继承类继承指的是一个类从另一个类中继承其属性和方法。

在Java语言中,一个父类可以有多个子类,但是一个子类只能有一个直接父类。

如果一个子类有多个父类,则会构成多重继承。

Java语言中不支持多重继承的原因是,这会造成命名冲突,无法确定调用哪个方法。

3.2 接口继承接口继承指的是一个接口从另一个接口中继承其方法签名。

在Java语言中,一个类可以实现多个接口,但是一个接口只能继承一个接口。

4. 继承的规则在Java语言中,有一些规则限制了继承的使用。

这些规则是:4.1 访问修饰符子类可以继承父类中的方法和属性,但是子类不能访问父类中的私有属性和私有方法。

另外,子类可以访问父类中的公有属性和公有方法。

4.2 构造函数子类不能继承父类的构造函数,但是可以通过调用父类的构造函数来初始化父类中的属性。

4.3 方法重写子类可以重写父类中的方法,以实现子类自己的特定需求。

在重写方法时,子类必须使用相同的方法签名(名称、参数列表和返回类型)。

4.4 super关键字子类可以使用super关键字来调用父类中的方法或属性。

java继承ppt课件

java继承ppt课件
代码重用
通过继承,子类可以重用父类的代码,避 免了重复编写相同的功能,提高了代码的
复用性。
组织代码结构
通过合理的继承层次结构,可以清晰地表 达类之间的层次关系和依赖关系,使代码
结构更加清晰和易于维护。
多态性
继承是实现多态的重要手段,通过继承, 子类可以覆盖父类的方法,实现不同的行 为,增强了程序的灵活性和可扩展性。
如果父类成员没有访问修饰符 ,则默认为包级别访问,子类
只能在该包内访问。
继承的继承方式
单继承
一个子类只能继承一个父类。
实现多接口
一个类可以实现多个接口,实现多接口可以实现多个方法的重写 。
接口继承
一个接口可以继承另一个接口,子接口继承父接口的方法。
03 Java继承的实现
父类的构造方法
01
父类的构造方法在子类中默认被继承,子类可以直 接使用父类的构造方法来初始化父类的属性。
02
如果子类没有显式地定义构造方法,则编译器会自 动调用父类的无参构造方法。
03
如果父类没有定义无参构造方法,子类必须显式地 调用父类的有参构造方法。
子类的构造方法
1
子类的构造方法可以显式地调用父类的构造方法 ,使用super关键字指定要调用的父类构造方法 。
2
子类的构造方法可以同时执行自己的初始化代码 。
3
子类的构造方法可以定义自己的属性和方法,以 实现更具体的功能。
子类对父类方法的覆盖
子类可以定义与父类同名 的方法,以覆盖父类的方 法。
子类可以通过@Override 注解来表明自己覆盖了父 类的方法,以提高代码的 可读性。
ABCD
当子类对象调用该方法时 ,将执行子类中的方法, 而不是父类中的方法。

java实验报告 类的继承

java实验报告 类的继承

java实验报告类的继承一、实验目的1、深入理解 Java 中类的继承概念和机制。

2、掌握通过继承实现代码复用和功能扩展。

3、学会使用 super 关键字和方法重写。

二、实验环境1、操作系统:Windows 102、开发工具:Eclipse 或 IntelliJ IDEA三、实验内容1、创建一个父类`Animal`包含属性:`name`(字符串类型),`age`(整数类型)包含方法:`eat()`(打印出动物正在吃东西),`sleep()`(打印出动物正在睡觉)2、创建子类`Dog` 继承自`Animal`新增属性:`breed`(字符串类型,表示狗的品种)重写父类的`eat()`方法,打印出狗吃东西的特有方式新增方法:`bark()`(打印出狗在叫)3、创建子类`Cat` 继承自`Animal`新增属性:`color`(字符串类型,表示猫的颜色)重写父类的`sleep()`方法,打印出猫睡觉的特有姿势新增方法:`meow()`(打印出猫在叫)四、实验步骤1、在 Java 项目中创建一个名为`Animal` 的类:```javapublic class Animal {private String name;private int age;public Animal(String name, int age) {thisname = name;thisage = age;}public void eat(){Systemoutprintln(name +" is eating");}public void sleep(){Systemoutprintln(name +" is sleeping");}}```2、创建一个名为`Dog` 的类继承自`Animal`:```javapublic class Dog extends Animal {private String breed;public Dog(String name, int age, String breed) {super(name, age);thisbreed = breed;}@Overridepublic void eat(){Systemoutprintln(supergetName()+" the "+ breed +" dog is eating greedily");}public void bark(){}}```3、创建一个名为`Cat` 的类继承自`Animal`:```javapublic class Cat extends Animal {private String color;public Cat(String name, int age, String color) {super(name, age);thiscolor = color;}@Overridepublic void sleep(){Systemoutprintln(supergetName()+" the "+ color +" cat is sleeping curled up");}public void meow(){}}```4、在`Main` 类中进行测试:```javapublic class Main {public static void main(String args) {Dog dog = new Dog("Buddy", 3, "Labrador");dogeat();dogbark();dogsleep();Cat cat = new Cat("Mimi", 2, "White");cateat();catsleep();catmeow();}}```五、实验结果1、运行`Main` 类后,输出结果如下:`Buddy the Labrador dog is eating greedily``Buddy is barking``Buddy is sleeping``Mimi is eating``Mimi the White cat is sleeping curled up``Mimi is meowing`2、可以看到,子类`Dog` 重写了父类`Animal` 的`eat()`方法,展示了狗特有的吃东西方式;子类`Cat` 重写了父类的`sleep()`方法,展示了猫特有的睡觉姿势。

JAVA继承、抽象类、接口

JAVA继承、抽象类、接口

JA V A继承、抽象类、接口编辑人:星辰·樱联系QQ:838826112一.类的继承通过继承可以实现代码的复用,被继承的类称为父类或超类(superclass),由继承而得到的类称为子类(subclass)。

一个父类可以拥有多个子类,但一个类只能有一个直接父类,这是因为JA V A语言中不支多重继承。

子类继承父类的成员变量和成员方法,同时可以修改父类的成员变量或重写父类的方法,还可以添加新的成员变量或成员方法。

JA V A语言中有一个名为ng.Object的特殊类,所有的类都是直接或间接地继承该类而得到的。

1.子类的创建类的继承是通过extends关键字来实现的,在定义类时若使用ectends关键字指出新定义类的父类,就是在两个类之间建立了继承关系。

新定义的类称为子类,它可以从父类那里继承所有非private的成员作为自己的成员。

子类的创建:* 格式:class SubClass extends SuperClass* {* .* .* .* }2.调用父类中特定的构造方法在没有明确地指定构造方法时,子类还是会先调用父类中没有参数的构造方法,以便进行初始化的操作。

在子类的构造方法中可以通过super()来调用父类特定的构造方法。

例://以Person作为父类,创建学生子类Student,并在子类中调用父类里某指定的构造方法。

class Person2{private String name;private int age;public Person2()//定义Person2类的无参构造方法{System.out.println("调用了Person2类的无参构造方法");}public Person2(String name,int age)//定义Person2类的有参构造方法{System.out.println("调用了Person2类的有参构造方法");=name;this.age=age;}public void show(){System.out.println("姓名:"+name+" 年龄:"+age);}}class Student2extends Person2//定义继承自Person2类的子类Student2{private String department;public Student2()//定义Student2类的无参构造方法{System.out.println("调用了学生类的无参构造方法Student2()");}public Student2(String name,int age,String dep)//定义Student2类的有参构造方法{super(name,age);//调用父类的胡参构造方法department=dep;System.out.println("我是"+department+"学生");System.out.println("调用了学生类的有参构造方法Student2(String name,int age,String dep)");}}public class App8_2 {public static void main(String[] args){Student2 stu1=new Student2();//创建对象,并调用无参构造方法Student2 stu2=new Student2("李小四",23,"信息系");//创建对象并调用有参构造方法stu1.show();stu2.show();}}/*在子类中访问你类的构造方法,其格式为super(参数列表)。

java类的继承实验报告

java类的继承实验报告

java类的继承实验报告Java类的继承实验报告引言:在面向对象的编程语言中,继承是一种重要的概念。

Java作为一种面向对象的编程语言,也提供了类的继承机制。

本实验旨在通过编写Java程序,深入理解和掌握Java类的继承。

实验目的:1. 理解继承的概念和原理;2. 掌握Java中类的继承的语法和用法;3. 实践继承的实际应用。

实验过程:1. 创建父类和子类在实验中,我们首先创建一个父类和一个子类。

父类可以是一个基本的类,子类则继承了父类的属性和方法。

这样,子类就可以在不改变父类的基础上,扩展自己的功能。

2. 继承的语法和用法Java中,使用关键字"extends"来实现类的继承。

子类通过继承父类,可以获得父类的属性和方法,并且可以在子类中添加新的属性和方法。

在实验中,我们可以通过创建子类对象,并调用继承自父类的方法来验证继承的正确性。

3. 方法的重写在继承中,子类可以重写父类的方法。

这样,当子类调用该方法时,实际上执行的是子类重写后的方法。

通过方法的重写,我们可以实现多态性的效果。

4. 实际应用在实验中,我们可以选择一个具体的应用场景,例如动物类的继承。

我们可以创建一个父类Animal,包含基本的属性和方法,然后创建子类Dog和Cat,分别继承Animal类,并添加自己的特有属性和方法。

通过这个实例,我们可以更好地理解继承的实际应用。

实验结果:通过实验,我们成功地创建了父类和子类,并验证了继承的正确性。

我们还成功地重写了父类的方法,实现了多态性的效果。

最后,我们还通过实际应用的例子,更好地理解了继承的实际应用。

实验总结:通过本次实验,我们深入理解和掌握了Java类的继承。

继承是面向对象编程中的重要概念,通过继承,我们可以实现代码的重用和扩展。

在实际应用中,继承也可以帮助我们更好地组织代码,提高代码的可读性和可维护性。

然而,继承也有一些限制和注意事项。

首先,Java中只支持单继承,即一个子类只能继承一个父类。

java的封装,继承和多态(思维导图)

java的封装,继承和多态(思维导图)

java的封装,继承和多态类和对象类类声明 { 成员变量的声明; 成员方法的声明及实现; }声明类:[修饰符] class 类<泛型> [extends 父类] [implements 接口列表]声明成员变量:[修饰符]数据类型 变量[=表达式]{,变量[=表达式]}成员方法声明:[修饰符]返回值类型 方法([形式参数列表])[throws 异常类列表]{语句序列;[return[返回值]]; }重载:一个类中可以有多个同名的成员方法,前提是参数列表不同,称为类的成员方法重载,重载的多个方法为一种功能提供多种实现。

重载方法之间必须以不同的参数列表(数据类型、参数个数、参数次序)来区别。

例如,MyDate 类可声明多个重载的set()方法如下: void set(int y,int m, int d)void set(int m, int d) //重载方法,参数个数不同void set(int d) void set(MyDate date)//重载方法,参数的数据类型不同对象对象声明:类 对象构造实例:对象 = new 类的构造方法([实际参数列表])引用对象的成员变量和调用成员方法:对象.成员变量 对象.成员方法([实际参数列表])类的封装性构造与析构类的构造方法用于创建类的一个实例并对实例的成员变量进行初始化一个类可声明多个构造方法对成员变量进行不同需求的初始化,构造方法不需要写返回值类型,因为它返回的就是该类的一个实例。

例:MyDate类声明以下构造方法:public MyDate(int year, int month, int day)// 声明构造方法,方法名同类名,初始化成员变量 {set(year, month day);// 调用 set()方法,为成员变量赋值}使用new运算符调用指定类的构造方法,实际参数列表必须符合构造方法声明。

例如:MyDate d1 = new MyDate(2017,10,1);//创建实例并初始化成员变量当一个类没有声明构造方法时,Java 自动为该类提供一个无参数的默认构造方法对象的引用与运算this引用访问本类的成员变量和成员方法:this.成员变量,this.成员方法([实际参数列表])调用本类重载的构造方法:this([实际参数列表])访问控制类的访问控制权限公有和(public)和缺省类中成员4级访问控制权限及范围声明set()和get()方法存取对象的属性例:public void set(int year, int month, int day) //设置日期值 public void set(MyDate date)//设置日期值,重载 public int getYear()//获得年份 public int getMonth()// 获得月份 public int getDay()//获得当月日期静态成员定义及访问格式使用关键字static声明的成员称为静态成员在类内部,可直接访问静态成员,省略类名。

Java程序设计(高校系列教材课件).ppt

Java程序设计(高校系列教材课件).ppt

1.21
高等学校计算机应用人才培养系列教材
常量、关键字和标识符
常量
常量代表某一特定类型的具体值,常量有数字常量、 布尔常量、字符常量和字符串常量之分。
数字常量包括两种:整型常量和浮点型常量。常用的 整型常量都是十进制的。整型常量还有另外两种进制 ,八进制和十六进制。在Java中,八进制的值通过在 它的前面加一个前导0来表示,而通过前导的0x或0X来 表示一个十六进制的值。
) 分布式(Distributed)
高等学校计算机应用人才培养系列教材
1.7
Java和Internet
在使用Java时,用户将从Internet下载Java字节码并在自 己的计算机上运行。在Web网页中运行的Java程序叫做 Applet。要使用Applet,需要有支持Java的浏览器,它可 以解释字节码。
True或false
1.19
高等学校计算机应用人才培养系列教材
Java的数据类型和变量
变量
变量是Java的一个基本存储单元。在Java中,在使用变量之前需要先 声明变量。变量声明通常包括三部分:变量类型、变量名、初始值, 其中变量的初始值是可选的。
以下是几个各种变量声明的例子,有一些包括了变量的初始化。
char
boolean
所占用字节数 1 2 4 8 4 8
2
1
范围 -128到127 -32,768到32, 767 -2,147,483,648到2,147,483,647 -9,223,372,036,854,775,808到 -9,223,372,036,854,775,807 大约 ±3.4+38 大约 ±1.7E+308
1.10
高等学校计算机应用人才培养系列教材
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

第5章类的继承、包及接口在前一章的实验中已经了解了类的基本构成、对象的创建及重载方法的应用等。

本章实验的任务主要是了解Java中类的继承、类包、内部类、匿名类及接口的基本构成及应用。

5.1 实验一:类的继承1. 实验目的1)正确理解Java中类继承基本概念及思想;2)基本掌握继承类和被继承类(子类和父类)之间的关系,正确地创建继承类。

2. 实验要求正确地划分类,根据类之间的关系,确定父类和子类,掌握覆盖方法的应用,完成类程序的编写与调试。

3. 实验内容在上一章的实验中,建立了公司职员信息类,现在需要处理职员的工资信息,建立职员工资类。

实验示例5.1.1 创建职员工资类Payroll类。

实现该示例的方法步骤如下:⑴首先分析一下该类的构成工资信息应包括职工的基本信息,因此可以把Employers类作为Payroll类的父类,Payroll类继承了父类所有的成员变量和方法,因此在Payroll类中需要定义的内容是:①成员变量对于工资信息项应该包括basicWage(基本工资)、positionWage(职位工资)、extraWage(附加工资)、other(其他补贴)等等。

它们均可声明为int (整数类型)。

②成员方法常常需要显示或获得全部或某些项工资的信息,因此需要定义如下一些方法:display() 显示工资的全部信息;display(int value) 显示一项工资额;display(int value1, int value2) 显示两项工资额。

③构造方法如前所述,一个类能够有多个构造对象方法,视需要而定。

对Payroll类来说可以给出两个构造方法:Payroll () 构造无名对象;Payroll(String ID,String name,String sex,String birthday,String home,String address, String number,int basicWage,int positionWage,int extraWage,int other) 构造一般对象。

⑵根据上边分析和描述,按照类的构成,给出如下类程序代码:public class Payroll extends Employers{int basicWage; //定义基本工资int positionWage; //定义职位工资int extraWage; //定义附加工资int other; //定义其他项public void display() //显示信息方法{super.display(); //引用父类的display()方法System.out.println("基本工资:"+basicWage);System.out.println("职位工资:"+positionWage);System.out.println("附加工资:"+extraWage);System.out.println("其他项:"+other);System.out.println("工资总额:"+(basicWage+positionWage+extraWage+ other));} //显示所有信息方法结束public void display(int value1) //显示一项工资额{System.out.println("工号:"+this.number+" 该项工资额:"+value1);} //显示一项工资额方法结束public void display(int value1,int value2) //显示两项工资额{System.out.println("工号:"+this.number+" 两项工资额分别是:"+value1+"、"+value2);} //显示两项工资额方法结束public Payroll() //构造方法{super();//引用父类的构造方法basicWage=0;positionWage=0;extraWage=0;other=0;} //无参构造方法结束public Payroll(String number,String name,String sex,String birthday,String home,String address,String ID,int basicWage,int positionWage,int extraWage,int other)//构造方法{super(number,name,sex,birthday,home,address,ID);//引用父类的构造方法this.basicWage=basicWage;this.positionWage=positionWage;this.extraWage=extraWage;this.birthday=birthday;this.other=other;} //有参构造方法结束}⑶在完成了公用类(public)Payroll源程序文件Payroll.java的建立之后,编译它生成类文件(.class字节码文件),以便在应用程序中使用它。

⑷程序分析该类是Employers类的子类,在程序中,覆盖(重写)了父类中的一些方法(如display()等),并使用super关键词引用父类方法。

要注意在使用super引用父类成员方法和构造方法的区别。

在完成上边的实验之后,请认真阅读、理解程序,仿照上边的程序,完成下边的自由练习。

自由练习5.1以上一章自由练习中建立的学生信息类Students为父类,建立一个学生学期的成绩单类Results,可以包含7~10项成绩,并包含可显示若干项成绩的方法。

实验示例5.1.2 测试Payroll类,编写测试程序TestPayroll.java,创建Payroll对象,显示职员对象工资的相关信息。

完成该示例的方法步骤如下:⑴这是一个测试Payroll类的程序,在测试程序中,我们需要创建Payroll类的对象,然后分别执行对象的各个方法,以测试类的功能。

⑵根据示例题目的要求,可给出如下的程序代码:public class TestPayroll{public static void main(String [] args){/* 首先创建一个无名和有名对象,测试两个构造方法*/Payroll e1=new Payroll();Payroll e2=new Payroll("0110","孙仁","男", "1988.10.15","重庆","航海路21号","422401************",600,500,400,200);/*测试对象的成员方法*/System.out.println("-------无名对象----------");e1.display();System.out.println("-------有名对象----------");e2.display();="力士靓"; //修改无名对象的名字e1.sex="女"; //修改无名对象的性别e1.birthday="1989.12.30"; //修改无名对象的生日e1.number="0111"; //修改无名对象的职员号e1.basicWage=500; //修改无名对象的基本工资System.out.println("--------"++"的基本工资-------");e1.display(e1.basicWage);System.out.println("--------"++"的基本工资、职位工资-------");e2.display(e2.basicWage,e2.positionWage);}}⑶编译并运行程序,程序执行结果如错误!未找到引用源。

所示。

图5-1 示例5.1.2程序执行结果 ⑷ 程序及执行结果分析与思考在程序中以创建无名对象和有名对象队两个构造方法的功能进行了测试,对无名对象的部分属性(name 、sex 等)进行了赋值处理,然后对显示一项工资额和显示两项工资额的方法进行了测试。

需要注意的是,在方法引用中参数是一一对应的,其相应的类型必须一致,否则在编译时将会出现编译错误。

在程序中创建了Payroll 对象,好像并没有涉及Employers 对象,请分析思考一下,为什么?作为本实验的部分,完成如下的自由练习:自由练习5.2 仿照上边测试程序,编写程序,完成对自由练习5.1建立的Result 类的功能的测试。

5.2 实验二:包及包中类的引用1. 实验目的1)正确理解Java 中包的基本概念;2)基本掌握包的创建以及包中类的引用。

2.实验要求根据包、类之间的关系,设计类(父类、子类或一般类)将它们放入包中,完成类程序的编写与调试,掌握包中类的引用方法。

3.实验内容实验示例 5.2.1 创建一个简单的汽车(Car )组件包(其中包括车身车架合成、发动机合成、控制组件合成)。

⑴ 汽车组件简要分析大家知道汽车是一个抽象的概念,因为汽车的种类繁多,功能各异。

但不管何类汽车都包括如下组件:车身车架(含驾驶室)、发动机、控制组件(变速器、驱动桥、转向制动系统等)。

因此一辆汽车可以看成是若干部件的组合。

如果我们分别把它们划分为汽车部件类,可以简单地描述如下:车身车架(CarBody )类:属性可以有:型号、颜色、轮胎个数等;动作有开门(open),关门(close);发动机(Engine )类:属性可以有:类型、功率等;动作有启动(start),关闭(close); 控制组件(ControlCompModule )类: 动作有:前进(forward)、倒退(backward),加速(quicken)、减速(slowDown)、停车(stop)等。

⑵ 根据如上简单分析,可以建立Car.java 源程序代码文件,分别定义各组件类,源程序参考代码如下:package car;/* 定义车身车架类*/class CarBody{String type; //声明类型String color; //声明颜色int tire; //声明轮胎数public void open(){System.out.println("车门已打开!");}public void close(){System.out.println("车门已关闭!");}public CarBody(String type,String color,int tire){this.type=type;this.color=color;this.tire=tire;}}/* 定义发动机类 */class Engine{String model; //声明发动机型号int power; //声明功率public void start(){System.out.println("发动机已发动!");}public void close(){System.out.println("发动机已关闭!");}public Engine(String model,int power){this.model=model;this.power=power;}}/* 以下定义控制系统类 */class ControlModule{public void forward(int speed){System.out.println("汽车以"+speed+"速度开始向前行进...");}public void backward(int speed){System.out.println("请注意:正在以"+speed+"速度倒车!");}public void stop(){System.out.println("已经停车!");}}⑶编译Car.java源程序代码,在car包中生成各个类的字节码文件,供其他应用程序使用。

相关文档
最新文档