《【教学课件】第4章继承与多态.ppt》由会员分享,可在线阅读,更多相关《【教学课件】第4章继承与多态.ppt(21页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第4章 继承与多态上一章主要阐述了类和对象的概念。本章将学习面向对象程序设计中两个重要的概念继承和多态。利用继承,可以基于已经存在的类构造新类,还可以在新类中添加一些新的成员或修改继承了的成员,以满足新的需求。而多态是在继承的基础上引出的,可以解决子类父类中的成员重名问题。4.1 继 承 概 述利用继承可以很好地实现代码重用问题。在利用已有的类构造新类时,新类保留已有类的属性和行为,并可以根据要求添加新的属性和行为。例如,卡车具有一般汽车的属性,而特有的属性就是载货。在第3章中,曾经介绍过类之间的关系:“USES-A”关系、“HAS-A”关系、“IS-A”关系。其中,“IS-A”关系是继承的一
2、个特征。4.1.1 超类、子类被继承的类一般称为“超类”或“父类”,继承的类称为“子类”。当子类继承超类时,不必写出全部的实例变量和方法,只需声明该类继承了的已定义的超类的实例变量和方法即可。超类、子类是继承中非常重要的概念,它们形象地描述了继承的层次关系。继承节省了定义新类的大量工作,可以方便地重用代码。例如,把汽车作为父类,当创建汽车的子类轿车时,品牌、价格、最高时速等属性会自动地被定义,调用刹车方法时会自动调用在汽车类中定义的刹车方法。但一个子类不必非要使用继承下来的属性和方法,一个子类可以选择覆盖已有的属性和方法,或添加新的属性和方法。4.1.2 继承层次继承关系可以用树形层次表达出来
3、。为汽车类的继承层次关系,注意,汽车类定义了品牌、价格、最高时速等属性(成员变量),以及刹车、启动等方法。当定义继承汽车类的子类卡车时,它自动继承汽车类的属性和方法。继承只是代码重用的一种方式,滥用继承会造成很严重的后果。只有当需要向新类添加新的操作,并且把已存在类的默认行为融合进新类中时,才需要继承已存在的类。4.2 Java中的继承在Java中,实际上所有的类均直接或间接继承自类,也可以说Object类是Java中的总根类。实际开发中,如不特殊指定,开发人员自己定义的类均直接继承自Object类。4.2.1 派生子类在Java中,类的继承通过entends关键字实现。在创建新类时,使用ex
4、tends指明新类的父类,具体语法如下。class 子类名 extends 父类名 子类类体4.2.2 继承规则当类B成功继承类A后,就涉及到成员变量的继承问题。下面将从两个方面介绍成员变量继承的相关知识,主要包括成员变量的继承规则与成员变量的隐藏。1成员变量的继承规则2成员变量的隐藏对于成员变量来说,当子类本身具有与继承自父类的成员变量名称相同的成员变量时,便构成了成员变量的隐藏。其含义是,在子类中直接调用该成员变量时,将调用的是子类中本身具有的成员变量,而不是从父类继承的成员变量,4.2.3 方法的继承与覆盖在类继承机制中,方法的继承和覆盖是其核心内容之一。方法继承允许子类使用父类的方法,
5、而覆盖是在子类中重新定义父类中的方法,更显示了继承的灵活性。1方法的继承从本质上讲,方法也是一种成员,因此继承规则与成员变量的继承规则完全一样,其是否能被继承同样取决与访问限制。2方法的覆盖子类的自身方法中,若与继承过来的方法具有相同的方法名,便构成了方法的重写(有的资料称之为方法的覆盖)。重写的主要优点是能够定义各子类的特有行为,4.2.4 this与super在Java中,this和super与继承是密切相关的。this常用来引用当前对象,而super常用来引用父类对象。1this方法中的某个对象与当前对象的某个成员有相同的名字,这时为了不至于混淆,可以使用this关键字来指明要使用某个成
6、员,使用方法是“this.成员名”,即使用this隐式地引用对象的实例变量和方法。2supersuper用来引用父类的成员,包含父类的构造函数、属性以及方法。使用方法为super变量名或super.方法名(实参)。4.3 强制类型转换在前面的章节中曾经介绍过,将一个类型强制转换为另一个数据类型的过程称为强制类型转换。本节中的强制类型转换只在继承过程中发生引用类型转换,而不是基本数据类型的转换。引用类型转换指对象引用的强制类型转换,在学习对象引用的强制类型转换之前,先介绍一下对象引用能指向什么样的对象。通过前面几章的学习,可以知道不管什么类型的对象引用,均能指向其自身类型的对象实例,下面的代码说
7、明了这个问题。1/汽车类型的引用c指向汽车类型的对象2Car c=new Car();3/卡车类型的引用t指向卡车类型的对象4.4 动 态 绑 定所谓的动态绑定,通俗的就是指,对象在调用方法的时候能够自己判断该调用谁的方法。所以动态绑定一般发生在继承、方法重载时。那么发生方法重载时,编译器如何确定调用的方法呢?例如,调用c.f(arg)时,首先需要将c声明为B类的对象。此时,如果在B类中,存在多个f方法,只是f的参数类型不同,调用f(int)或者f(String)时,编译器逐一列举B类中所有名为f的方法以及B类超类中访问权限为public的名为f的方法。如果存在与c.f(arg)中arg类型相
8、匹配的方法,那么就调用这个方法。由此,调用哪个方法依赖于隐式参数的实际类型。这个过程可以就是一个动态绑定的过程。4.5 终止继承:Final类和Final方法关键字Final不但可以用来修饰变量,而且对类及其方法的继承也有很大的影响,本节将从类与方法两方面介绍final关键字的功能。4.5.1 Final类当关键字final用来修饰类时,其含义是该类不能再派生子类。换句话说,任何其他类都不能继承用final修饰的类,即使该类的访问限制为public类型,也不能被继承;否则,将编译报错。那么什么时候应该使用final修饰类呢?只有当需要确保类中的所有方法都不被重写时才应该建立最终(final)类
9、,final关键字将为这些方法提供安全,没有任何人能够重写final类中的方法,因为不能继承。4.5.2 Final方法当用final关键字修饰方法后,该方法在子类中将无法重写,只能继承,下面的代码说明了这个问题。要恰当使用final的方法,只有在子类覆盖某个方法会带来问题时,再将此方法设为final的方法,一般情况下可以不必使用。因为防止子类覆盖会失去一些面向对象的优点,包括通过覆盖实现的可扩展性。4.6 抽 象 类在现实世界中,当人们认识世界时,也会把现实世界很多具有相同特征的事物归为一个抽象类。例如,水果是很多种具体植物果实的总称(抽象类),当需要拿出一个水果的实例时,拿出来的不是苹果就
10、是香蕉等具体种类的实例,拿不出只是水果的实例。在需要一个抽象类实例时,只能用某个具体类的实例来代替。Java是用来抽象和描述现实世界的,因此也提供抽象类,并且其永远不能实例化,其唯一用途是用于继承扩展,这与人们认识现实世界的方式是相同的。本节介绍抽象类和抽象方法。4.6.1 抽象类如果从上而下观察类的层次结构,位于上层的类更具有通用性。一般情况下,人们这将这些通用的类作为派生其他类的基类。在Java中,可以使用abstract关键字声明抽象类和抽象方法。下面的例子将Car类声明为抽象类。Car类表示轿车,里面有3个成员变量,分别表示所有轿车都有的价格、品牌、最高时速等属性。4.6.2 抽象的方
11、法抽象方法充当着占位的角色,其具体实现在子类中。抽象方法是只有方法声明,没有方法体,使用abstract关键字来声明的方法。因为抽象方法没有方法体,用分号表示声明结束,下面给出了抽象方法的声明。public abstract void startup()4.7 多 态前面介绍继承与覆盖以及强制类型转换时都曾提及“多态”的概念。多态性(Polymorphism)在实际中的含义就是不同的对象有相同的轮廓或形态,但具体执行的过程却大相径庭。例如,驾驶员在开车时都知道“遇到红灯时刹车”,这与驾驶员驾驶的是什么型号的车无关,所有的车都具有相同的轮廓或形态的刹车。在Java开发中,基于继承的多态就是指对象
12、功能的调用者用超类的引用来进行方法调用。这样,可以提高灵活性,因为用超类的引用能调用各种不同的子类实现,就像汽车驾驶员可以开各种不同的汽车一样。4.8 所有类的超类:Object类Java中的所有类都直接或间接继承自Object类,因此Object类具有的功能所有的类都具有。本节将对Object类当中的一些重要的方法进行介绍,主要包括toString、equals与hashCode方法。1toString方法toString方法是Object中的重要方法之一,该方法将返回此对象的字符串表示,以便在实际运行或调试代码时可以获取字符串表示的对象状态信息,下面给出了该方法的定义形式。4.8 所有类的
13、超类:Object类2equals方法的意义前面介绍比较两个String的类内容是否相同时,使用了equals方法。其实,equals方法都是来自Object类的,String类对其进行了重写以满足比较字符串内容的要求。Object类中设计这个方法就是为了让继承它的类来重写,以满足比较不同类型对象是否等价的要求。在Object类中,该方法的实现相当于如下代码。1public boolean equals(Object obj)23return(this=obj);44.9 小结本章首先介绍了Java的一项基本特性继承,及其具体的实现方法。然后介绍了成员变量与方法的继承、方法的重载、final与abstract的类与方法,最后讨论了基于继承的多态在Java中的实现。通过本章的学习,为读者后面学习更多其他面向对象的知识打下了良好的基础。