版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第第5章章 类与类的关系类与类的关系 5.1 类与类的关系类与类的关系 5.2 类的继承类的继承 5.3抽象类与抽象方法抽象类与抽象方法 5.4接口接口 5.5包包 5.1 类与类的关系类与类的关系 使用关系使用关系 包含关系包含关系 继承关系继承关系 类间的使用关系类间的使用关系 当类当类A需要从需要从 B类对象中获得信息时,称类类对象中获得信息时,称类A与类与类B之间存在使用关系。一般情况下,之间存在使用关系。一般情况下,当在类当在类A的一个方法中创建、接收或返回类的一个方法中创建、接收或返回类B的对象时,称类的对象时,称类A使用类使用类B。 TestPerson.javagetName(
2、)setName()main()创建Person类对象调用Person类的方法TestPerson类Person类使用包含关系包含关系 当类当类A中的一个属性是类中的一个属性是类B的对象时,称类的对象时,称类A与类与类B存在包含关系,包容关系是一个存在包含关系,包容关系是一个“有有一个一个”关系,如果类关系,如果类A包含类包含类B,可以称类,可以称类A中有一个类中有一个类B。 例如例如car类和类和engine类类 /域定义Engine e;int speed;Engine类Car类包含继承关系继承关系 继承是面向对象的一个重要特性,当类继承是面向对象的一个重要特性,当类A是是类类B的特例时,
3、称类的特例时,称类A继承了类继承了类B。子类与父。子类与父类之间存在类之间存在“是一个是一个”的关系,子类继承自的关系,子类继承自父类,因此子类也是一个父类。父类,因此子类也是一个父类。 吉普车是汽车的一个特例,它具有汽车的属吉普车是汽车的一个特例,它具有汽车的属性,同时具有自己的一些特性。性,同时具有自己的一些特性。 Employer类Manager类5.2 类的继承类的继承 存在两个类:类存在两个类:类A与类与类B,如果类如果类B中拥有类中拥有类A中所中所有的域与方法,有的域与方法,就称这两个类之间存在继承关系,就称这两个类之间存在继承关系,并称类并称类B继承于类继承于类A。其中,类。其中
4、,类B被称为子类,类被称为子类,类A叫做超类(叫做超类(superclass),也叫做基类(),也叫做基类(base class)或父类()或父类(parent class)。)。 子类继承父类的属性时,不能改变父类中类成员子类继承父类的属性时,不能改变父类中类成员的访问权限,即继承自父类中类成员的权限在子的访问权限,即继承自父类中类成员的权限在子类中仍然保持不变。类中仍然保持不变。 生物类鸟类人类植物类动物类农民工人.自然界生物类的继承关系图 子类的创建和使用子类的创建和使用 类继承是用关键字类继承是用关键字extends来实现的来实现的 public class Worker extend
5、s Person 子类父类TestInheritance.java 域:x1,x2,x3方法:add_x1, add_x2, add_x3,get_x3,get_x3方法:sub_x1,sub_x2,sub_x3域:x1,x2,x3方法:add_x1, add_x2, add_x3,get_x3,get_x3SuperAClassB类继承的传递性类继承的传递性 类继承具有传递性,如果类类继承具有传递性,如果类B继承类继承类A,而,而类类C又继承类又继承类B,那么类,那么类C中不仅拥有类中不仅拥有类B中中的所有成员,还拥有类的所有成员,还拥有类A中的所有成员。中的所有成员。 域的隐藏域的隐藏 父
6、类父类A和子类和子类B中都定义了名称相同的成员变量中都定义了名称相同的成员变量x,称为域的隐藏。称为域的隐藏。 在域的隐藏中,子类和父类中的该变量名称必须在域的隐藏中,子类和父类中的该变量名称必须相同,而变量的类型可以不同相同,而变量的类型可以不同 JavaJava规定,当执行从父类继承的方法时,处理的规定,当执行从父类继承的方法时,处理的是继承自父类的变量;当子类执行由自己定义的是继承自父类的变量;当子类执行由自己定义的方法时,处理的是自己定义的成员变量,而将继方法时,处理的是自己定义的成员变量,而将继承自父类的名称相同的域隐藏起来。承自父类的名称相同的域隐藏起来。 class A int
7、x=3; public void m() x+; System.out.println(“the x of A is ”+x); class B extends A int x=20; public void n() x-; System.out.println(“the x of B is ”+x); class Bint x;int x; /从类从类A继承的域继承的域 public void m() /从类从类A继承方法继承方法 x+; System.out.print(“the x of A is ”+x);public void n() x-; System.out.println(“
8、the x of B is ”+x); 等价于等价于/类类A的的x/类类B的的x域的隐藏域的隐藏 类中发生域的隐藏后,子类中的域覆盖了父类中发生域的隐藏后,子类中的域覆盖了父类中同名的域,如果想要访问被隐藏的域,类中同名的域,如果想要访问被隐藏的域,必须在域前面添加前缀,前缀用关键字必须在域前面添加前缀,前缀用关键字super加圆点操作符。加圆点操作符。 B.javaB.java 方法的覆盖方法的覆盖 方法的覆盖是在子类和父类中方法名相同、参数方法的覆盖是在子类和父类中方法名相同、参数表相同和返回值类型相同的方法,这时,子类中表相同和返回值类型相同的方法,这时,子类中的方法将会覆盖父类中的同名
9、方法。的方法将会覆盖父类中的同名方法。 子类和父类中的方法必须满足以下三个条件才能子类和父类中的方法必须满足以下三个条件才能实现方法的覆盖:实现方法的覆盖: 相同的方法名 相同的方法返回类型 相同的参数表,即参数的个数、顺序和参数的类型必须完全相同。 super关键字关键字 关键字关键字super在在Java中,表示当前对象的直中,表示当前对象的直接父类,是当前对象的直接父类对象的引用。接父类,是当前对象的直接父类对象的引用。在类继承中,使用super关键字可以访问超类中子类隐藏的域和被子类覆盖的方法。程序V.java 继承关系中的构造方法继承关系中的构造方法 在类继承过程中,子类继承了父类的
10、所有成在类继承过程中,子类继承了父类的所有成员,但是子类不能显式使用父类的构造方法。员,但是子类不能显式使用父类的构造方法。 例如:例如: V b = new A(); /V b = new A(); /错误的用法错误的用法 子类对父类构造方法的继承遵循下面的子类对父类构造方法的继承遵循下面的规则:规则: 创建子类对象实例时,系统可以自动调用父类的无参数构造方法初始化属于父类的数据。 对于父类中带参数的构造方法,系统不能自动调用它们,只能通过在子类构造方法中使用关键字super进行调用,并且,super语句必须是子类构造方法中的第一个可执行语句 UseConstru.java 类对象之间的类型
11、转换类对象之间的类型转换 类作为一种复合数据类型,与基本数据类型类作为一种复合数据类型,与基本数据类型的变量一样,不同类型的类对象之间也可以的变量一样,不同类型的类对象之间也可以进行类型转换。类型转换也分为显式类型转进行类型转换。类型转换也分为显式类型转换和隐式类型转换。换和隐式类型转换。 类型转换只能在父类对象和子类对象之间进类型转换只能在父类对象和子类对象之间进行行 父类与子类对象之间的类型转换规则是:父类与子类对象之间的类型转换规则是: 类对象转换为父类类型时,可以进行隐式类型转换和显式类型转换。父类对象转换为子类类型时,必须进行显式类型转换。例如:B ref_b,b = new B()
12、;A a;a=b;ref_b=(B)a; 类型转换的一个问题类型转换的一个问题 如果在程序中创建父类如果在程序中创建父类A的对象,将它进行的对象,将它进行类型转换为子类类型类型转换为子类类型B。虽然编译时不会出。虽然编译时不会出错,运行时将会抛出一个异常。错,运行时将会抛出一个异常。 Java.lang.ClassCastException 将将D.java改为如下代码:改为如下代码:class D public static void main(String args) B ref_b; A a = new A(); ref_b=(B)a; class D public static voi
13、d main(String args) B ref_b; B b = new B(); A a; a=b; ref_b=(B)a; 类型转换的一个问题类型转换的一个问题 为了避免这种情况发生,可以采用为了避免这种情况发生,可以采用instanceof运算符来检查对象是不是要转换运算符来检查对象是不是要转换类的实例。将上面类类的实例。将上面类D的代码改为如下代码,的代码改为如下代码,在进行类型转换时,先进行类型检查,避免在进行类型转换时,先进行类型检查,避免了异常的发生:了异常的发生:class D public static void main(String args) B ref_b; A
14、a = new A(); if (a instanceof B) ref_b=(B)a; System.out.println(a.x=+a.x); System.out.println(ref_b.x=+ref_b.x+, ref_b.y= +ref_b.y); 抽象类与抽象方法抽象类与抽象方法 在面向对象程序设计中,越是处在继承结构在面向对象程序设计中,越是处在继承结构的顶层的类,就越概括、越抽象。我们常常的顶层的类,就越概括、越抽象。我们常常需要定义一些表示抽象概念的类,这些类为需要定义一些表示抽象概念的类,这些类为子类提供一个实现框架,本身却不能提供具子类提供一个实现框架,本身却不能提
15、供具体的实例体的实例, ,这称为抽象类。这称为抽象类。 JavaJava中用关键字中用关键字abstractabstract表示抽象意义,表示抽象意义,abstractabstract可以修饰类和方法。可以修饰类和方法。 抽象类与抽象方法抽象类与抽象方法 用用abstract修饰的方法称为抽象方法,抽象修饰的方法称为抽象方法,抽象方法只有方法头,没有方法体定义,也就是方法只有方法头,没有方法体定义,也就是说,抽象方法没有具体的实现。说,抽象方法没有具体的实现。 用用abstract修饰的类称为抽象类,抽象类是修饰的类称为抽象类,抽象类是一种没有完全实现的类,即在抽象类中拥有一种没有完全实现的类
16、,即在抽象类中拥有抽象方法。包含抽象方法的类必须被声明为抽象方法。包含抽象方法的类必须被声明为抽象类,并且不能用抽象类声明具体的实例抽象类,并且不能用抽象类声明具体的实例对象。对象。抽象类抽象类 抽象类是本身不能被实例化的类,它只能作抽象类是本身不能被实例化的类,它只能作为其它类的超类。为其它类的超类。 在面向对象编程中,抽象类的设计是为了使在面向对象编程中,抽象类的设计是为了使程序的结构更加清晰,功能更加明确。程序的结构更加清晰,功能更加明确。 例例如:如:GSMGSM手机用户管理系统中用户类的设计。手机用户管理系统中用户类的设计。 GsmUserPostGsmUserPreGsmUser抽
17、象类的特点抽象类的特点 是一种非完整类,它不能实例化一个对象是一种非完整类,它不能实例化一个对象 抽象类定义时被关键字抽象类定义时被关键字abstractabstract修饰。修饰。 抽象类中不一定拥有抽象方法,但拥有抽象抽象类中不一定拥有抽象方法,但拥有抽象方法的类一定是抽象类。方法的类一定是抽象类。 如果抽象类的子类不是抽象的,它必须实现如果抽象类的子类不是抽象的,它必须实现抽象类中的所有抽象方法。抽象类中的所有抽象方法。抽象方法抽象方法 抽象方法是在抽象类中只有方法头而没有方抽象方法是在抽象类中只有方法头而没有方法体的方法。例如:法体的方法。例如: public abstract boo
18、lean dial(); 利用抽象方法,抽象类可以提供一个完整的利用抽象方法,抽象类可以提供一个完整的编程界面,即在抽象类中提供子类中需要实编程界面,即在抽象类中提供子类中需要实现的方法的声明,而将方法的实现细节留给现的方法的声明,而将方法的实现细节留给子类实现。子类实现。 定义抽象方法时,需要注意:定义抽象方法时,需要注意: 抽象方法必须在抽象类中进行定义。抽象方法必须在抽象类中进行定义。 不能用关键字不能用关键字abstract来修饰构造方法来修饰构造方法 关键字关键字static和和private不能与不能与abstract组合组合使用。使用。 关键字关键字final不能与不能与abst
19、ract组合使用。组合使用。 接口接口 接口(接口(interface)与类相似,它是)与类相似,它是Java中中的一种复合数据类型。界面也称为一种特殊的一种复合数据类型。界面也称为一种特殊的、完全没有实现的类,的、完全没有实现的类, 与抽象类不同,接口中定义的所有方法都是与抽象类不同,接口中定义的所有方法都是抽象方法,并且接口中定义的所有域都是常抽象方法,并且接口中定义的所有域都是常量。量。 接口接口定义的语法如下:定义的语法如下:public interface interfaceName extends superinterface1, superinterface2,superinte
20、rfacen/界面体界面体 /域定义域定义 publicstaticfinal type constName = constValue; /方法定义方法定义 p u b l i c a b s t r a c t r e t u r n t y p e functionName(pariList)throws exceptionList;包包 包是一组相关类和接口的集合。不同于继承、包是一组相关类和接口的集合。不同于继承、包含关系,包内的类之间具有松散的使用关包含关系,包内的类之间具有松散的使用关系。系。 可以对复杂系统中大量的类和接口进方便地、可以对复杂系统中大量的类和接口进方便地、有效的管
21、理,提高了类和接口的安全性,更有效的管理,提高了类和接口的安全性,更好地体现类的封装特性好地体现类的封装特性 Java中对包的管理类似于操作系统中对文件中对包的管理类似于操作系统中对文件系统的目录管理。系统的目录管理。Java中通过多个层次的包中通过多个层次的包把各种类文件(后缀为把各种类文件(后缀为.class的类文件)组的类文件)组织在一起,包的层次在计算机中保存为目录。织在一起,包的层次在计算机中保存为目录。 在包语句中,用圆点(在包语句中,用圆点(.)指明包的层次。例)指明包的层次。例如,如下的包语句:如,如下的包语句: package java.io.event; 表示java.io
22、.event包内的类文件存储在目录 javaawtevent下。包的创建包的创建 Java中,包的定义用关键字中,包的定义用关键字package实现,包定实现,包定义的语法如下:义的语法如下: package pk1.pk2pk3 pk1,pk2等为包的名字,方括号等为包的名字,方括号 中的内容是可中的内容是可选的,采用圆点(选的,采用圆点(.)表示包的层次。)表示包的层次。 例:例: package mypk; class ExtenComputeE. class ComputeE. 表示定义了一个名为表示定义了一个名为mypk的包,它将的包,它将ExtenComputeE类和类和 Comp
23、uteE类都封装在包类都封装在包mypk中中 。包的引用包的引用1.采用前缀包名法,是在要引用其它的类名前面,添加这个类所属的包名采用前缀包名法,是在要引用其它的类名前面,添加这个类所属的包名和圆点操作符(和圆点操作符(.)。例如:)。例如:/ AcPublicclass.javapublic class AcPublicclass public static void main(String a) mypack.t.PublicClass m = new mypack.t.PublicClass(); /添添加包名前缀加包名前缀 pc.changex(2.0f); System.out.pr
24、intln(pc.i = +pc.i); pc.i+; System.out.println(pc.i = +pc.i); 程序中程序中AcPublicclass,需要使用,需要使用PublicClass类,在创建该类对象的类,在创建该类对象的时候,需要使用包名做前缀来定位时候,需要使用包名做前缀来定位PublicClass类。前缀包名法很少使类。前缀包名法很少使用,一般用来区别不同包中的同名类。用,一般用来区别不同包中的同名类。包的引用包的引用2. 用引入语句也可以使用其它包中的类,引入语句用关键字用引入语句也可以使用其它包中的类,引入语句用关键字import实现,实现,实现语法如下:实现语法如下:import packageName.Classname;packageName为要引入类所属包的名字,为要引入类所属包的名字,Classname为类的名字。为类的名字。前面的程序前面的程序AcPublicclass.java用引入语句实现如下:用引入语句实现如下:im
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025版智能库房备货与仓储物流合同3篇
- 二零二五年度抵账合同范本:风险控制策略3篇
- 2025年度协议离婚原因探讨及财产分割与子女抚养责任协议3篇
- 二零二五年度智慧农业项目建设、运营与移交协议2篇
- 二零二五年专业家政服务人员安全责任合同范本3篇
- 二零二五年度接送机服务与企业团建合同
- 检测与传感课程设计
- 二零二五年度地质灾害风险评估与勘察设计服务合同2篇
- 2025年度版权买卖合同:知名歌手专辑的版权购买与发行3篇
- 饲草料加工机械安全操作规程(2篇)
- 2024年5G网络覆盖工程分包合同
- 2025届北京市海淀区交大附中高一物理第一学期期末复习检测试题含解析
- 护理员技能培训课件
- 煤矿防治水细则解读
- 四川新农村建设农房设计方案图集川东北部分
- 2023智能座舱白皮书-聚焦电动化下半场-毕马威
- 福建省福州市九师教学联盟2023-2024学年高一上学期期末学业联考化学试题(解析版)
- 植物病虫害防治技能大赛理论题及答案
- 2024-2025学年六年级科学上册第二单元《地球的运动》测试卷(教科版)
- 福建省厦门市2023-2024学年高二上学期期末考试语文试题(原卷版)
- 生态河道治理工程施工组织设计
评论
0/150
提交评论