- 1、本文档共38页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第5章 类与类的关系 5.1 类与类的关系 5.2 类的继承 5.3抽象类与抽象方法 5.4接口 5.5包 5.1 类与类的关系 使用关系 包含关系 继承关系 类间的使用关系 当类A需要从 B类对象中获得信息时,称类A与类B之间存在使用关系。一般情况下,当在类A的一个方法中创建、接收或返回类B的对象时,称类A使用类B。 TestPerson.java 包含关系 当类A中的一个属性是类B的对象时,称类A与类B存在包含关系,包容关系是一个“有一个”关系,如果类A包含类B,可以称类A中有一个类B。 例如car类和engine类 继承关系 继承是面向对象的一个重要特性,当类A是类B的特例时,称类A继承了类B。子类与父类之间存在“是一个”的关系,子类继承自父类,因此子类也是一个父类。 吉普车是汽车的一个特例,它具有汽车的属性,同时具有自己的一些特性。 5.2 类的继承 存在两个类:类A与类B,如果类B中拥有类A中所有的域与方法,就称这两个类之间存在继承关系,并称类B继承于类A。其中,类B被称为子类,类A叫做超类(superclass),也叫做基类(base class)或父类(parent class)。 子类继承父类的属性时,不能改变父类中类成员的访问权限,即继承自父类中类成员的权限在子类中仍然保持不变。 子类的创建和使用 类继承是用关键字extends来实现的 public class Worker extends Person { … } TestInheritance.java 类继承的传递性 类继承具有传递性,如果类B继承类A,而类C又继承类B,那么类C中不仅拥有类B中的所有成员,还拥有类A中的所有成员。 域的隐藏 父类A和子类B中都定义了名称相同的成员变量x,称为域的隐藏。 在域的隐藏中,子类和父类中的该变量名称必须相同,而变量的类型可以不同 Java规定,当执行从父类继承的方法时,处理的是继承自父类的变量;当子类执行由自己定义的方法时,处理的是自己定义的成员变量,而将继承自父类的名称相同的域隐藏起来。 域的隐藏 类中发生域的隐藏后,子类中的域覆盖了父类中同名的域,如果想要访问被隐藏的域,必须在域前面添加前缀,前缀用关键字super加圆点操作符。 B.java 方法的覆盖 方法的覆盖是在子类和父类中方法名相同、参数表相同和返回值类型相同的方法,这时,子类中的方法将会覆盖父类中的同名方法。 子类和父类中的方法必须满足以下三个条件才能实现方法的覆盖: 相同的方法名 相同的方法返回类型 相同的参数表,即参数的个数、顺序和参数的类型必须完全相同。 super关键字 关键字super在Java中,表示当前对象的直接父类,是当前对象的直接父类对象的引用。 在类继承中,使用super关键字可以访问超类中子类隐藏的域和被子类覆盖的方法。 程序V.java 继承关系中的构造方法 在类继承过程中,子类继承了父类的所有成员,但是子类不能显式使用父类的构造方法。 例如: V b = new A(); //错误的用法 子类对父类构造方法的继承遵循下面的规则: 创建子类对象实例时,系统可以自动调用父类的无参数构造方法初始化属于父类的数据。 对于父类中带参数的构造方法,系统不能自动调用它们,只能通过在子类构造方法中使用关键字super进行调用,并且,super语句必须是子类构造方法中的第一个可执行语句 UseConstru.java 类对象之间的类型转换 类作为一种复合数据类型,与基本数据类型的变量一样,不同类型的类对象之间也可以进行类型转换。类型转换也分为显式类型转换和隐式类型转换。 类型转换只能在父类对象和子类对象之间进行 父类与子类对象之间的类型转换规则是: 类对象转换为父类类型时,可以进行隐式类型转换和显式类型转换。 父类对象转换为子类类型时,必须进行显式类型转换。 例如: B ref_b,b = new B(); A a; a=b; ref_b=(B)a; 类型转换的一个问题 如果在程序中创建父类A的对象,将它进行类型转换为子类类型B。虽然编译时不会出错,运行时将会抛出一个异常。 Java.lang.ClassCastException 将D.java改为如下代码: 类型转换的一个问题 为了避免这种情况发生,可以采用instanceof运算符来检查对象是不是要转换类的实例。将上面类D的代码改为如下代码,在进行类型转换时,先进行类型检查,避免了异常的发生: 抽象类与抽象方法 在面向对象程序设计中,越是处在继承结构的顶层的类,就越概括、越抽象。我们常常需要定义一些表示抽象概念的类,这些类为子类提供一个实现框架,本身却不能提供具体的实例,这称为抽象类。 Java中用关键
文档评论(0)