《第七章继承和多态.ppt》由会员分享,可在线阅读,更多相关《第七章继承和多态.ppt(34页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第七章继承和多态现在学习的是第1页,共34页内容回顾v构造方法v方法重载v封装与访问权限控制现在学习的是第2页,共34页本讲内容v继承与方法重写v多态v抽象类与抽象方法vinstanceof运算符与类型转换 现在学习的是第3页,共34页本讲目标v掌握继承的概念及用法。v掌握多态的概念及用法v掌握抽象类的使用现在学习的是第4页,共34页为什么使用继承?v这两个类图有什么问题?-name:String-health:int-love:int-strain:StringDog+print():void+getName():String+getHealth():int+getLove():int+ge
2、tStrain:String+Dog()-name:String-health:int-love:int-sex:StringPenguin+print():void+getName():String+getHealth():int+getLove():int+getSex():String+Penguin()使用继承优化设计使用继承优化设计 将重复代码将重复代码抽取到父类抽取到父类中中现在学习的是第5页,共34页继承的好处使用继承优化后:使用继承优化后:子类与父类是子类与父类是is-a关系关系 减少代码量减少代码量 方便修改代方便修改代码码 现在学习的是第6页,共34页如何使用继承v使用继承
3、编写父类编写子类,继承父类class Pet /公共的属性和方法公共的属性和方法class Dog extends Pet /子类特有的属性和方法子类特有的属性和方法class Penguin extends Pet 只能继承一个父类只能继承一个父类 继承关键字继承关键字 现在学习的是第7页,共34页继承的实现vextends关键字用于继承类。v声明一个继承父类的类的通常形式如下:class subclass-name extends superclass-name /类体 例:class Student extends Person 注:注:没有没有extends,默认父类为,默认父类为Ob
4、ject,是最高层类。是最高层类。只能有一个父类,即单继承只能有一个父类,即单继承现在学习的是第8页,共34页理解继承v子类访问父类成员访问父类属性访问父类方法 使用使用super关键字关键字 super.name;super.print();super代表父代表父类对象类对象 现在学习的是第9页,共34页理解继承v子类继承了父类的属性和方法v但有些父类成员不能继承:private成员 子类与父类不在同包,使用默认访问权限的成员构造方法现在学习的是第10页,共34页继承的特点v通过继承可以简化类的定义,实现代码的重用vJava只支持单继承,不允许多重继承。v可以有多层继承;类B继承类A;类C继
5、承类B;v子类继承父类的成员变量和成员方法,但不继承父类的构造方法v在子类的构造方法中可用super(参数列表)调用父类的构造方法。v如果子类的构造方法中没有显式的调用父类构造方法,也没有使用this关键字调用自己的其他构造方法,那么在产生子类实例对象时JVM自动调用父类无参数的构造方法。现在学习的是第11页,共34页何时使用继承何时使用继承?继承与真实世界类似只要说“猫是哺乳动物”,猫的很多属性、行为 就不言自明了藏獒是一种狗继承是代码重用的一种方式 将子类都有的属性和行为放到父类中将子类都有的属性和行为放到父类中 符合符合is-a关系的设计使用继承关系的设计使用继承 现在学习的是第12页,
6、共34页小结v阅读代码,说出运行结果class Car private int site=4;/座位数座位数 Car()System.out.println(载客量是载客量是+site+人人);public void setSite(int site)this.site=site;void print()System.out.print(载客量是载客量是+site+人人);class Bus extends Car Bus(int site)setSite(site);public static void main(String args)Bus bus=new Bus(20);bus.pri
7、nt();载客量是载客量是4人人载客量是载客量是20人人 现在学习的是第13页,共34页方法重写v子类中有和父类相同签名的方法,会如何?子类子类重写重写父类方法父类方法 现在学习的是第14页,共34页方法重写v子类可以定义与父类同名的变量,实现对父类变量的隐藏v子类可以定义与父类同名的方法,实现对父类方法的覆盖,即方法重写v方法重写的条件:方法重写的条件:必须具有相同的方法名;必须具有相同的参数列表;重写方法的返回值类型必须和被重写方法的返回值类型相同或者是其子类;重写方法的不能缩小被重写方法的访问权限。现在学习的是第15页,共34页方法重写v构造方法能被重写吗?v如何在子类中调用父类的构造方
8、法?super();super(参数表参数表);可以被默认可以被默认添加添加 只能是构造方法的只能是构造方法的第一条语句第一条语句 不能被继承因此不能重写不能被继承因此不能重写 现在学习的是第16页,共34页方法修饰符方法修饰符方法修饰符方法修饰符方法修饰符staticfinalabstract现在学习的是第17页,共34页static修饰符vstatic修饰符修饰的方法叫静态方法v目的:使该方法独立于类的实例,使用类去访问,而不是类实例,所以也叫类方法 规规规规 则则则则可以调用其他静态方法必须访问静态数据不能使用 super 或 this 关键字现在学习的是第18页,共34页final修饰
9、符 finalfinal不能修改变量不能修改变量子类不能重写方法子类不能重写方法类不能被继承类不能被继承现在学习的是第19页,共34页vPenguin类不希望再被其他类继承?使用final类v方法不希望被重写?使用final方法v属性值不希望被修改?使用final方法final用法public final class Penguin extends Pet /最终版的类最终版的类 public final void print()/最终版的方法最终版的方法public class Penguin final String home=南极南极;/居住地居住地 public void setHom
10、e(String name)this.home=home;/错误,错误,home不可以再次赋值不可以再次赋值 最终版的属性值最终版的属性值现在学习的是第20页,共34页abstract修饰符v由abstract修饰的方法叫抽象方法;由abstract修饰的类叫抽象类v抽象方法必须声明在抽象类中v抽象方法语法:abstract type method_name(parameter_list);v声明抽象类语法:abstract class v使用:父类中的某些抽象不包含任何逻辑,并需要在子类中重写,子类提供这种抽象方法的实现细节v抽象方法没有方法体v抽象方法必须在子类中被实现,除非子类是抽象类现
11、在学习的是第21页,共34页 abstractabstract抽象类不能被实例化构造方法 和 static 方法不能是抽象的父类的抽象方法往往在子类中实现 abstract修饰符现在学习的是第22页,共34页小结继承成员变量的隐藏与方法的覆盖的区别为:子类隐藏父类的成员变量只是使之不可见,父类的同名成员变量在子类对象中仍然占有自己独立的内存空间;而子类方法对父类同名方法的覆盖将清除父类方法占用的内存,从而使父类方法在子类对象中不存在。方法的覆盖与成员变量的隐藏的意义:将父类行为和状态改为自身的行为和状态,对外仍保持统一的接口和名字,不失继承性。现在学习的是第23页,共34页小结继承v猜猜以下程
12、序的运行结果猜猜以下程序的运行结果class Person public Person()System.out.println(person constructor);class Man extends Person public Man()System.out.println(man constructor);class ChineseMan extends Man public ChineseMan()System.out.println(chineseman constructor);public class Test public static void main(String arg
13、s)ChineseMan cm=new ChineseMan();现在学习的是第24页,共34页多态v宠物生病了,需要主人给宠物看病不同宠物看病过程不一样不同宠物恢复后体力值不一样 打针打针 吃药吃药 吃药吃药 疗养疗养 狗狗狗狗 Q仔仔 现在学习的是第25页,共34页v编写主人类编写给狗狗看病的方法编写给Q仔看病的方法为什么使用多态public class Master public void Cure(Dog dog)if(dog.getHealth()50)dog.setHealth(60);System.out.println(打针、吃药打针、吃药);public void Cure(
14、Penguin penguin)if(penguin.getHealth()50)penguin.setHealth(70);System.out.println(吃药、疗养吃药、疗养);主人类主人类 Master master=new Master();master.Cure(dog);master.Cure(penguin);测试方法测试方法 现在学习的是第26页,共34页为什么使用多态v如果又需要给XXX看病,怎么办?添加XXX类,继承Pet类修改Master类,添加给XXX看病的方法 使用使用多态多态优化设计优化设计 频繁修改代码,代码可扩展性、可维护性差频繁修改代码,代码可扩展性、可
15、维护性差 现在学习的是第27页,共34页为什么使用多态v使用多态优化后的代码 Pet pet=new Dog();Master master=new Master();master.Cure(pet);测试方法测试方法 public class Dog extends Pet public void toHospital()this.setHealth(60);System.out.println(打针、吃药打针、吃药);public class Penguin extends Pet public void toHospital()this.setHealth(70);System.out.
16、println(吃药、疗养吃药、疗养);public class Master public void Cure(Pet pet)if(pet.getHealth()50)pet.toHospital();主人类主人类 Dog类类 Penguin类类 1234又要给又要给XXX看病时,只需:看病时,只需:1.编写编写XXX类继承类继承Pet类(旧方案也需要)类(旧方案也需要)2.创建创建XXX类对象(旧方案也需要)类对象(旧方案也需要)3.其他代码不变(不用修改其他代码不变(不用修改Master类)类)现在学习的是第28页,共34页什么是多态v生活中的多态你能列举出一个多态的生活示例吗?v程序
17、中的多态多态:同一个引用类型,使用不同的实例而执行不同多态:同一个引用类型,使用不同的实例而执行不同操作操作 父类引用,父类引用,子类对象子类对象 同一种事物,由于条件不同,产生的结果也不同同一种事物,由于条件不同,产生的结果也不同现在学习的是第29页,共34页实现多态要素v实现多态的两个要素:实现多态的两个要素:1.方法重写方法重写 2.使用父类类型使用父类类型现在学习的是第30页,共34页方法重写v方法重写的规则在继承关系的子类中重写的方法名、参数、返回值类型必须与父类相同私有方法不能继承因而也无法重写 位置方法名参数表返回值访问修饰符方法重写子类相同相同相同不能比父类更严格方法重载同类相
18、同不同无关无关 方法重写方法重写 方法重载方法重载 VS现在学习的是第31页,共34页类型转换v子类转换为父类:子类转换为父类:自动转换自动转换v假设A类是B类的父类,当我们用子类创建一个对象,而这个对象的引用放到父类的对象中时。A a;a=new B();或 A a;B b=new B();a=b;称这个父类对象a是子类对象的上转型对象。例如:“老虎是哺乳动物”,哺乳类是老虎类的父类,但这样说将失掉老虎独有的属性。现在学习的是第32页,共34页类型转换v子类转换为父类细节上转型对象不能操作子类新增的成员变量和方法。上转型对象可以操作子类继承或重写的成员变量和方法如果子类重写了父类的某个方法,
19、上转型对象调用该方法时,是调用的重写方法。v父类转换为子类:强制转换现在学习的是第33页,共34页instanceof运算符v该运算符用来判断一个对象是否属于一个类或者实现了一个接口,结果为true或falsev在强制类型转换之前通过instanceof运算符检查对象的真实类型,可以避免类型转换异常,从而提高代码健壮性对象对象 instanceof 类或接口类或接口/*测试测试instanceof运算符的使用。运算符的使用。*author 北大青北大青鸟鸟*/public class TestPoly2 public static void main(String args)Pet pet=n
20、ew Penguin(楠楠楠楠,Q妹妹);/Pet pet=new Dog(欧欧欧欧,雪娜瑞雪娜瑞);pet.eat();if(pet instanceof Dog)Dog dog=(Dog)pet;dog.catchingFlyDisc();else if(pet instanceof Penguin)Penguin pgn=(Penguin)pet;pgn.swimming();/*测试测试instanceof运算符的使用。运算符的使用。*author*/public class TestPoly2 public static void main(String args)/Pet pet=new Penguin(楠楠楠楠,Q妹妹);Pet pet=new Dog(欧欧欧欧,雪娜瑞雪娜瑞);pet.eat();if(pet instanceof Dog)Dog dog=(Dog)pet;dog.catchingFlyDisc();else if(pet instanceof Penguin)Penguin pgn=(Penguin)pet;pgn.swimming();注释创建注释创建Penguin 对象语句,取消创对象语句,取消创建建Dog对象语句的注释对象语句的注释现在学习的是第34页,共34页