《第3讲继承与多态精选PPT.ppt》由会员分享,可在线阅读,更多相关《第3讲继承与多态精选PPT.ppt(27页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第3讲继承与多态第1页,本讲稿共27页4.1 继 承 概 述利用继承可以很好地实现代码重用问题。在利用已有的类构造新类时,新类保留已有类的属性和行为,并可以根据要求添加新的属性和行为。例如,卡车具有一般汽车的属性,而特有的属性就是载货。在第3章中,曾经介绍过类之间的关系:“USES-A”关系、“HAS-A”关系、“IS-A”关系。其中,“IS-A”关系是继承的一个特征。第2页,本讲稿共27页4.1.1 超类、子类被继承的类一般称为“超类”或“父类”,继承的类称为“子类”。当子类继承超类时,不需声明该类继承了的已定义的超类的实例变量和方法,子类体内只需写出新增的变量和方法即可。超类、子类是继承中
2、非常重要的概念,它们形象地描述了继承的层次关系。继承节省了定义新类的大量工作,可以方便地重用代码。例如,把汽车作为父类,当创建汽车的子类轿车时,品牌、价格、最高时速等属性会自动地被定义,调用刹车方法时会自动调用在汽车类中定义的刹车方法。但一个子类不必非要使用继承下来的属性和方法,一个子类可以选择覆盖已有的属性和方法,或添加新的属性和方法。第3页,本讲稿共27页4.1.2 继承层次继承关系可以用树形层次表达出来。为汽车类的继承层次关系,注意,汽车类定义了品牌、价格、最高时速等属性(成员变量),以及刹车、启动等方法。当定义继承汽车类的子类卡车时,它自动继承汽车类的属性和方法。继承只是代码重用的一种
3、方式,滥用继承会造成很严重的后果。只有当需要向新类添加新的操作,并且把已存在类的默认行为融合进新类中时,才需要继承已存在的类。第4页,本讲稿共27页4.2 Java中的继承在Java中,实际上所有的类均直接或间接继承自java.lang.Object类,也可以说Object类是Java中的总根类。实际开发中,如不特殊指定,开发人员自己定义的类均直接继承自Object类。第5页,本讲稿共27页4.2.1 派生子类在Java中,类的继承通过entends关键字实现。在创建新类时,使用extends指明新类的父类,具体语法如下。class 子类名 extends 父类名 子类类体第6页,本讲稿共27
4、页4.2.2 继承规则当类B成功继承类A后,就涉及到成员变量的继承问题。下面将从两个方面介绍成员变量继承的相关知识,主要包括成员变量的继承规则与成员变量的隐藏。1成员变量的继承规则2成员变量的隐藏对于成员变量来说,当子类本身具有与继承自父类的成员变量名称相同的成员变量时,便构成了成员变量的隐藏。其含义是,在子类中直接调用该成员变量时,将调用的是子类中本身具有的成员变量,而不是从父类继承的成员变量,第7页,本讲稿共27页继承原则子类继承父类的成员变量,包括实例成员变量和类成员变量。子类继承父类除构造方法以外的成员方法,包括实例成员方法和类成员方法。子类不能继承父类的构造方法。因为父类构造方法创建
5、的是父类对象,子类必须声明自己的构造方法,创建子类自己的对象。子类能够继承父类的析构方法。子类不能删除父类成员。子类可以增加自己的成员变量和成员方法。子类可以重定义父类成员。第8页,本讲稿共27页多重继承的概念美国教授研究出空中汽车没有翅膀也能飞行。据了解,MX-400试用2年多来,它最高飞行时速超过了600多公里,比直升机快2倍,可载4人,飞行最大高度9000米,航程1500公里。遇上风雨交加,它也能畅行无阻,夜晚照样飞行,其飞行本领毫不逊色一般的飞机。可是飞机需要机场、跑道才能起降、飞行,.交通工具有三类:空中交通工具、水上交通工具、陆地交通工具。空中汽车属于?Java不直接支持多重继承。
6、第9页,本讲稿共27页4.2.3 方法的继承与覆盖在类继承机制中,方法的继承和覆盖是其核心内容之一。方法继承允许子类使用父类的方法,而覆盖是在子类中重新定义父类中的方法,更显示了继承的灵活性。1方法的继承从本质上讲,方法也是一种成员,因此继承规则与成员变量的继承规则完全一样,其是否能被继承同样取决与访问限制。2方法的覆盖(override)覆盖(override)是指子类声明并实现父类中的同名方法并且参数列表也完全相同。重写的主要优点是能够定义各子类的特有行为,第10页,本讲稿共27页4.2.4 this与super在Java中,this和super与继承是密切相关的。this常用来引用当前对
7、象,而super常用来引用父类对象。1this方法中的某个对象与当前对象的某个成员有相同的名字,这时为了不至于混淆,可以使用this关键字来指明要使用某个成员,使用方法是“this.成员名”,即使用this隐式地引用对象的实例变量和方法。this-本对象 2supersuper用来引用父类的成员,包含父类的构造函数、属性以及方法。使用方法为super变量名或super.方法名(实参)。第11页,本讲稿共27页4.3 强制类型转换在前面的章节中曾经介绍过,将一个类型强制转换为另一个数据类型的过程称为强制类型转换。本节中的强制类型转换只在继承过程中发生引用类型转换,而不是基本数据类型的转换。引用类
8、型转换指对象引用的强制类型转换,在学习对象引用的强制类型转换之前,先介绍一下对象引用能指向什么样的对象。通过前面几章的学习,可以知道不管什么类型的对象引用,均能指向其自身类型的对象实例,下面的代码说明了这个问题。1/汽车类型的引用c指向汽车类型的对象2Car c=new Car();3/卡车类型的引用t指向卡车类型的对象第12页,本讲稿共27页4.4 动 态 绑 定所谓的动态绑定,通俗的就是指,对象在调用方法的时候能够自己判断该调用谁的方法。所以动态绑定一般发生在继承、方法重载时。那么发生方法重载时,编译器如何确定调用的方法呢?例如,调用c.f(arg)时,首先需要将c声明为B类的对象。此时,
9、如果在B类中,存在多个f方法,只是f的参数类型不同,调用f(int)或者f(String)时,编译器逐一列举B类中所有名为f的方法以及B类超类中访问权限为public的名为f的方法。如果存在与c.f(arg)中arg类型相匹配的方法,那么就调用这个方法。由此,调用哪个方法依赖于隐式参数的实际类型。这个过程可以就是一个动态绑定的过程。第13页,本讲稿共27页多态性 例如,Student是Person的子类,编译时多态性Person p1=new Person(李小明,21);/对象获得本类的实例,对象与其获得的实例类型一致Student s1=new Student(王大伟,19);p1.pri
10、nt();/编译时多态性,执行Person类的方法s1.print();/编译时多态性,执行Student类覆盖的方法运行时多态性Person p2=new Student();/p2获得子类对象,对象与其获得的实例类型不一致p2.print();/运行时多态,执行Student类覆盖的方法第14页,本讲稿共27页4.5 终止继承:Final类和Final方法关键字Final不但可以用来修饰变量,而且对类及其方法的继承也有很大的影响,本节将从类与方法两方面介绍final关键字的功能。第15页,本讲稿共27页4.5.1 Final类当关键字final用来修饰类时,其含义是该类不能再派生子类。换句
11、话说,任何其他类都不能继承用final修饰的类,即使该类的访问限制为public类型,也不能被继承;否则,将编译报错。那么什么时候应该使用final修饰类呢?只有当需要确保类中的所有方法都不被重写时才应该建立最终(final)类,final关键字将为这些方法提供安全,没有任何人能够重写final类中的方法,因为不能继承。第16页,本讲稿共27页4.5.2 Final方法当用final关键字修饰方法后,该方法在子类中将无法重写,只能继承,下面的代码说明了这个问题。要恰当使用final的方法,只有在子类覆盖某个方法会带来问题时,再将此方法设为final的方法,一般情况下可以不必使用。因为防止子类覆
12、盖会失去一些面向对象的优点,包括通过覆盖实现的可扩展性。第17页,本讲稿共27页4.6 抽 象 类在现实世界中,当人们认识世界时,也会把现实世界很多具有相同特征的事物归为一个抽象类。例如,水果是很多种具体植物果实的总称(抽象类),当需要拿出一个水果的实例时,拿出来的不是苹果就是香蕉等具体种类的实例,拿不出只是水果的实例。在需要一个抽象类实例时,只能用某个具体类的实例来代替。Java是用来抽象和描述现实世界的,因此也提供抽象类,并且其永远不能实例化,其唯一用途是用于继承扩展,这与人们认识现实世界的方式是相同的。本节介绍抽象类和抽象方法。第18页,本讲稿共27页4.6.1 抽象类如果从上而下观察类
13、的层次结构,位于上层的类更具有通用性。一般情况下,人们这将这些通用的类作为派生其他类的基类。在Java中,可以使用abstract关键字声明抽象类和抽象方法。下面的例子将Car类声明为抽象类。Car类表示轿车,里面有3个成员变量,分别表示所有轿车都有的价格、品牌、最高时速等属性。第19页,本讲稿共27页4.6.2 抽象的方法抽象方法充当着占位的角色,其具体实现在子类中。抽象方法是只有方法声明,没有方法体,使用abstract关键字来声明的方法。因为抽象方法没有方法体,用分号表示声明结束,下面给出了抽象方法的声明。public abstract void startup()第20页,本讲稿共27
14、页4.7 多 态前面介绍继承与覆盖以及强制类型转换时都曾提及“多态”的概念.。多态性(Polymorphism)在实际中的含义就是不同的对象有相同的轮廓或形态,但具体执行的过程却大相径庭。例如,驾驶员在开车时都知道“遇到红灯时刹车”,这与驾驶员驾驶的是什么型号的车无关,所有的车都具有相同的轮廓或形态的刹车。多态有两种用法:重载、覆盖。在Java开发中,基于继承的多态就是指对象功能的调用者用超类的引用来进行方法调用。这样,可以提高灵活性,因为用超类的引用能调用各种不同的子类实现,就像汽车驾驶员可以开各种不同的汽车一样。简单来理解,多态就是“一个名称多个含义”,比如我们常说哺乳动物会发出“叫”声,
15、然后又会说狗会“叫”,猫会“叫”第21页,本讲稿共27页4.8 所有类的超类:Object类Java中的所有类都直接或间接继承自Object类,因此Object类具有的功能所有的类都具有。本节将对Object类当中的一些重要的方法进行介绍,主要包括toString、equals与hashCode方法。1toString方法toString方法是Object中的重要方法之一,该方法将返回此对象的字符串表示,以便在实际运行或调试代码时可以获取字符串表示的对象状态信息,下面给出了该方法的定义形式。第22页,本讲稿共27页4.8 所有类的超类:Object类2equals方法的意义前面介绍比较两个St
16、ring的类内容是否相同时,使用了equals方法。其实,equals方法都是来自Object类的,String类对其进行了重写以满足比较字符串内容的要求。Object类中设计这个方法就是为了让继承它的类来重写,以满足比较不同类型对象是否等价的要求。在Object类中,该方法的实现相当于如下代码。1public boolean equals(Object obj)23return(this=obj);4第23页,本讲稿共27页4.9 小结本章首先介绍了Java的一项基本特性继承,及其具体的实现方法。然后介绍了成员变量与方法的继承、方法的重载、final与abstract的类与方法,最后讨论了基
17、于继承的多态在Java中的实现。通过本章的学习,为读者后面学习更多其他面向对象的知识打下了良好的基础。第24页,本讲稿共27页作业1.什么是类?什么是对象?它们之间的关系如何?2.引用数据类型对象在赋值和方法的参数传递方面与基本数据类型的变量有什么不同?3.面向对象技术的三个核心特性是什么?/(1)封装(2)继承(3)多态4.什么是封装?5.类的构造方法有什么作用?被谁调用?访问权限范围怎样?是否每个类都必须设计构造方法?6.Java定义了几个关键字各用于表示什么访问权限?表示何含义?类有几种访问访问权限?类中的成员有几种访问权限?第25页,本讲稿共27页7.This引用有什么作用?This引
18、用有几种用法?Super引用有什么作用?super引用有几种用法?8.类成员与实例成员的区别?9.什么是继承?继承机制的作用是什么?子类继承了父类中的什么?子类不需要父类中的成员时怎么办?能够删除它们吗?Java运行一个类有多个父类吗?10.子类能够访问父类中什么样权限的成员?11.如果子类声明的成员与父类成员同名会怎样?12.什么是多态性?什么是方法的重载、覆盖?重载和覆盖有什么区别?13.什么是抽象类?在什么情况下需要设计抽象类?抽象类中是否必须有抽象方法。14.Object类的作用是什么?Object类中声明了哪些方法?Object类在java类层次结构中的地位是怎样的?第26页,本讲稿
19、共27页完成下面父类及子类的声明:a.声明Student类。属性包括:学号,姓名,英语成绩,数学成绩,计算机成绩,总成绩。方法包括:构造方法,get方法,set方法,toString方法,equals方法,compare方法(比较两个学生的总成绩,结果分大于,小于,等于),sum方法(计算总成绩),testScore方法(计算评测成绩)。注:评测成绩可以取三门课成绩的平均分,另外任何一门课的成绩的改变都需要对总成绩进行重新计算,因此,在每一个set方法中应调用sum方法计算总成绩。b.声明StudentXW(学习委员)类为Student类的子类。在StudentXW类中增加责任属性,并重写testScore方法(计算评测成绩,评测成绩三门课的平均分+3)。c.声明StudentBZ(班长)类为Student类的子类。在StudentBZ类中增加责任属性,并重写testScore方法(计算评测成绩,评测成绩三门课的平均分+5)。d.声明测试类,生成若干个Student类、StudentXW类及StudentBZ类对象,并分别计算他们的评测成绩。第27页,本讲稿共27页