第4章继承与多态概要

上传人:今*** 文档编号:107467340 上传时间:2019-10-19 格式:PPT 页数:55 大小:831KB
返回 下载 相关 举报
第4章继承与多态概要_第1页
第1页 / 共55页
第4章继承与多态概要_第2页
第2页 / 共55页
第4章继承与多态概要_第3页
第3页 / 共55页
第4章继承与多态概要_第4页
第4页 / 共55页
第4章继承与多态概要_第5页
第5页 / 共55页
点击查看更多>>
资源描述

《第4章继承与多态概要》由会员分享,可在线阅读,更多相关《第4章继承与多态概要(55页珍藏版)》请在金锄头文库上搜索。

1、第4章 继承与多态,利用继承,可以基于已经存在的类构造新类,还可以在新类中添加一些新的成员或修改继承了的成员,以满足新的需求。 而多态是在继承的基础上引出的,可以解决子类父类中的成员重名问题。,为什么需要继承?,以下解决方案中有什么问题?,如何解决?,4.1 继 承 概 述,利用继承可以很好地实现代码重用问题。 在利用已有的类构造新类时,新类保留已有类的属性和行为,并可以根据要求添加新的属性和行为。 例如,卡车具有一般汽车的属性,而特有的属性就是载货。 曾经介绍过类之间的关系:“USES-A”关系、“HAS-A”关系、“IS-A”关系。其中,“IS-A”关系是继承的一个特征。,4.1.1 超类

2、、子类,被继承的类一般称为“超类”或“父类”,继承的类称为“子类”。 当子类继承超类时,不必写出全部的实例变量和方法,只需声明该类继承了的已定义的超类的实例变量和方法即可。 继承节省了定义新类的大量工作,可以方便地重用代码。 但一个子类不必非要使用继承下来的属性和方法,一个子类可以选择覆盖已有的属性和方法,或添加新的属性和方法。,4.1.2 继承层次,继承关系可以用树形层次表达出来。 为汽车类的继承层次关系,注意,汽车类定义了品牌、价格、最高时速等属性(成员变量),以及刹车、启动等方法。当定义继承汽车类的子类卡车时,它自动继承汽车类的属性和方法。 继承只是代码重用的一种方式,滥用继承会造成很严

3、重的后果。 只有当需要向新类添加新的操作,并且把已存在类的默认行为融合进新类中时,才需要继承已存在的类。,4.1.2 继承层次,4.2 Java中的继承,在Java中,实际上所有的类均直接或间接继承自java.lang.Object类,也可以说Object类是Java中的总根类。 实际开发中,如不特殊指定,开发人员自己定义的类均直接继承自Object类。,4.2.1 派生子类,在Java中,类的继承通过entends关键字实现。在创建新类时,使用extends指明新类的父类,具体语法如下。 class 子类名 extends 父类名 子类类体 ,4.2.2 继承规则,当类B成功继承类A后,就涉

4、及到成员变量的继承问题。下面将从两个方面介绍成员变量继承的相关知识,主要包括成员变量的继承规则与成员变量的隐藏。 1成员变量的继承规则(取决于访问权限) 2成员变量的隐藏 对于成员变量来说,当子类本身具有与继承自父类的成员变量名称相同的成员变量时,便构成了成员变量的隐藏。其含义是,在子类中直接调用该成员变量时,将调用的是子类中本身具有的成员变量,而不是从父类继承的成员变量,,例题4-1 public类型成员变量示例1,例题4-2 public类型成员变量示例2,例题4-3 成员变量隐藏示例,读程序,看输出结果是多少?,4.2.3 方法的继承与覆盖,方法继承允许子类使用父类的方法,而覆盖是在子类

5、中重新定义父类中的方法,更显示了继承的灵活性。 1方法的继承 方法也是一种成员,因此继承规则与成员变量的继承规则完全一样 其是否能被继承同样取决与访问限制。,4.2.3 方法的继承与覆盖,2方法的覆盖 子类的自身方法中,若与继承过来的方法具有相同的方法名,便构成了方法的重写(有的资料称之为方法的覆盖)。 * 子类的方法名称返回类型及参数签名 必须与父类的一致 * 子类方法不能缩小父类方法的访问权限 * 方法覆盖只存在于子类和父类之间,同一个类中只能重载 * 父类的静态方法不能被子类覆盖为非静态方法 * 父类的非静态方法不能被子类覆盖为静态方法 * 父类的私有方法不能被子类覆盖,public c

6、lass Vehicle /startUp方法表示一般交通工具的启动功能 public void startUp() System.out.println(“一般交通工具的启动方法!“); public class Car extends Vehicle public void startUp() System.out.println(“轿车的启动方法!“); public class Sample4_5 public static void main(String args) /创建对象并调用方法 Car c=new Car(); System.out.print(“实际调用的方法为:“);

7、 c.startUp(); ,4.2.4 this与super,在Java中,this和super与继承是密切相关的。this常用来引用当前对象,而super常用来引用父类对象。 1this 方法中的某个对象与当前对象的某个成员有相同的名字,这时为了不至于混淆,可以使用this关键字来指明要使用某个成员,使用方法是“this.成员名”,即使用this隐式地引用对象的实例变量和方法。 2super super用来引用父类的成员,包含父类的构造函数、属性以及方法。使用方法为super变量名或super.方法名(实参)。,this使用示例,public class Sample4_8 private

8、 int x, y; public Sample4_8(int x, int y) this.x = x; this.y = y; public Sample4_8() this(0, 0); public static void main(String srgs) Sample4_8 s = new Sample4_8(); System.out.println(s.x); System.out.println(s.y); ,修改程序,演示super的用法,super使用示例,public class Person public String info = “我是父类“; public st

9、atic void printMessage(String s) System.out.println(s); public Person() printMessage(“A Person.“); public Person(String name) printMessage(“A person name is:“ + name); ,public class Sample4_9 extends Person public Sample4_9() super(); printMessage(“相关信息:“); System.out.println(super.info); public Sam

10、ple4_9(String name) super(name); printMessage(“名字:“ + name); public Sample4_9(String name, int age) this(name); printMessage(“年龄:“ + age); public static void main(String args) Sample4_9 cn = new Sample4_9(); cn = new Sample4_9(“张三“); cn = new Sample4_9(“张三“, 22); ,4.3 强制类型转换,本节中的强制类型转换只在继承过程中发生引用类型转

11、换,而不是基本数据类型的转换。 引用类型转换指对象引用的强制类型转换,在学习对象引用的强制类型转换之前,先介绍一下对象引用能指向什么样的对象。通过前面几章的学习,可以知道不管什么类型的对象引用,均能指向其自身类型的对象实例,下面的代码说明了这个问题。 1 /汽车类型的引用c指向汽车类型的对象 2 Car c=new Car(); 3 /卡车类型的引用t指向卡车类型的对象 4 Truck t = new Truck();,class Vehicle class Car extends Vehicle class Truck extends Car Truck类继承自Car类,所以Truck类也是

12、Vehicle类派生出来的子类。 Vehicle v = new Car(); v=new Truck(); Car c = new Truck();,4.4 动 态 绑 定,所谓的动态绑定,对象在调用方法的时候能够自己判断该调用谁的方法。 所以动态绑定一般发生在继承、方法重载时。 那么发生方法重载时,编译器如何确定调用的方法呢?,4.4 动 态 绑 定,例如,调用c.f(arg)时,首先需要将c声明为B类的对象。此时,如果在B类中,存在多个f方法,只是f的参数类型不同,调用f(int)或者f(String)时,编译器逐一列举B类中所有名为f的方法以及B类超类中访问权限为public的名为f的

13、方法。如果存在与c.f(arg)中arg类型相匹配的方法,那么就调用这个方法。 由此,调用哪个方法依赖于隐式参数的实际类型。这个过程可以就是一个动态绑定的过程。,4.4 动 态 绑 定,如果setName( )是private、static 或者final类型的,就不用进行动态绑定了,因为系统编译器可以自己准确的知道要调用哪些方法。 由于Java中允许类型转换,所以要找到合适的方法是一个复杂的过程。 如果编译器没有找到合适的方法,则直接报错,抛出异常。,4.5 终止继承:Final类和Final方法,关键字Final不但可以用来修饰变量,而且对类及其方法的继承也有很大的影响。 本节将从类与方法

14、两方面介绍final关键字的功能。,4.5.1 Final类,当关键字final用来修饰类时,其含义是该类不能再派生子类。 换句话说,任何其他类都不能继承用final修饰的类,即使该类的访问限制为public类型,也不能被继承;否则,将编译报错。 那么什么时候应该使用final修饰类呢? 只有当需要确保类中的所有方法都不被重写时才应该建立最终(final)类,注意:只要有Final这个关键字来修饰类时,子类就不能继承父类,4.5.2 Final方法,当用final关键字修饰方法后,该方法在子类中将无法重写,只能继承。,在Son类中show()方法覆盖了Father中的show(),被覆盖的方法

15、被final修饰,那final方法不能被继承。,4.5.2 Final方法,要恰当使用final的方法; 只有在子类覆盖某个方法会带来问题时,再将此方法设为final的方法,一般情况下可以不必使用; 因为防止子类覆盖会失去一些面向对象的优点,包括通过覆盖实现的可扩展性。,4.6 抽 象 类,在现实世界中,当人们认识世界时,也会把现实世界很多具有相同特征的事物归为一个抽象类。 例如,水果是很多种具体植物果实的总称(抽象类),当需要拿出一个水果的实例时,拿出来的不是苹果就是香蕉等具体种类的实例,拿不出只是水果的实例。在需要一个抽象类实例时,只能用某个具体类的实例来代替。 Java是用来抽象和描述现

16、实世界的,因此也提供抽象类,并且其永远不能实例化,其唯一用途是用于继承扩展。,4.6.1 抽象类,如果从上而下观察类的层次结构,位于上层的类更具有通用性。 一般情况下,人们这将这些通用的类作为派生其他类的基类。 在Java中,可以使用abstract关键字声明抽象类和抽象方法。,注意:抽象类不能进行实例化 abstract和final不能同时使用,4.6.2 抽象的方法,抽象方法,其具体实现是在子类中。 抽象方法是只有方法声明,没有方法体,使用abstract关键字来声明的方法。 因为抽象方法没有方法体,用分号表示声明结束,下面给出了抽象方法的声明。 public abstract void startup ( ),注意:非抽象类Car中不能有抽象的方法startUp()。要正常编译,需将Car类声明为抽象类,abstract class Car / 定义

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号