面向对象编程08继承和多态

上传人:san****019 文档编号:70928744 上传时间:2019-01-19 格式:PPT 页数:24 大小:2.25MB
返回 下载 相关 举报
面向对象编程08继承和多态_第1页
第1页 / 共24页
面向对象编程08继承和多态_第2页
第2页 / 共24页
面向对象编程08继承和多态_第3页
第3页 / 共24页
面向对象编程08继承和多态_第4页
第4页 / 共24页
面向对象编程08继承和多态_第5页
第5页 / 共24页
点击查看更多>>
资源描述

《面向对象编程08继承和多态》由会员分享,可在线阅读,更多相关《面向对象编程08继承和多态(24页珍藏版)》请在金锄头文库上搜索。

1、第四章 面向对象编程,本章主要内容,4.1 简介 4.2 面向对象的基本概念 4.3 面向对象的基本语法 4.4 类和包 4.5 类的方法 4.6 对象 4.7 继承和多态 4.8 接口和抽象类 4.9 面向对象开发概念,定义类的方法的步骤是什么? 类中的一个方法如何调用类的另一个方法? 类中的一个方法如何调用另一个类的方法? 分别说明成员变量和局部变量的作用域。 如何给类的方法添加JavaDoc注释?,课程回顾,本章目标,掌握继承 掌握super关键字 掌握多态,4.6 继承和多态,计算机语言设计犹如在 公园里漫步。我是说侏 罗纪公园 。 Larry Wall (Perl 语言之父),生活中

2、的继承,生活中,继承的例子随处可见,动物,食草动物,食肉动物,谁是父类? 谁是子类? 能说出继承的特点吗?,继承需要符合的关系:is-a,父类更通用、子类更具体,生活中的继承,子类具有父类的一般特性(包括属性和行为),以及自身特殊的特性,巴士是汽车吗? 卡车是汽车吗? 出租车是汽车吗?,汽车,请问:出租车包含哪些属性和行为呢?,4.6.1 类和类的继承,类的设计其实是对现有世界的模仿 在继承中,一般常见的有属性继承,属性隐藏,方法继承,方法覆盖,方法重载等技术。 在Java语言中,用extends关键字来表示一个类继承了另一个类 在父类中只定义一些通用的属性与方法 子类自动继承父类的属性和方法

3、,子类中可以定义特定的属性和方法 子类的构造方法中,通过super关键字调用父类的构造方法 方法重写后,通过super关键字调用父类的方法 在Java 中,所有的Java类都直接或间接地继承了java.lang.Object类,如何实现继承 3-1,在Java语言中,用extends关键字来表示一个类继承了另一个类,例如:,public class Woman extends Human /其余代码省略 ,在父类中只定义一些通用的属性与方法,例如:,public class Human private String name; private String school; public Hum

4、an(String name, String sex, int age) /初始化属性值 public void canEat() public void breath() ,如何实现继承 3-2,子类自动继承父类的属性和方法,子类中可以定义特定的属性和方法,public class Human private String name; / 教员姓名 private String sex;/ 所在中心 public Human (String myName, String mySex) /初始化属性值 public void sayHello() /方法的具体实现 ,public class

5、Father extends Human public Father(String myName, String mySex) super(myName, mySex); public void sayHello() System.out.println(“你好,我是爸爸“); super.sayHello(); ,由于sayHello()方法与父类的实现有所不同,因此重写了该方法,方法重写:子类和父类的方法具有相同的名称、参数列表、返回类型,父类中的属性和方法可以被子类继承,public class Father extends Human public Father(String myNa

6、me, String mySex) super(myName, mySex); ,如何实现继承 3-3,子类的构造方法中,通过super关键字调用父类的构造方法,方法重写后,通过super关键字调用父类的方法,public class Father extends Human public void sayHello() System.out.println(“你好,我是爸爸“); super.sayHello(); ,通过调用父类的构造方法,完成对属性值的初始化,一切类的“祖先”Object,在Java 中,所有的Java类都直接或间接地继承了java.lang.Object类,public

7、 class MyObject / ,public class MyObect extends Object / ,在Eclipse中调用MyObject对象的成员,会自动弹出继承自Object的所有方法,4.6.1 类和类的继承,函数的覆盖和重载的区别,4.6.1 类和类的继承,重载的情况下,子类的访问权限比父类要大。 参看课本例4.15 Man类: 用于测试Man类的程序:,为什么需要多态 5-1,在Woman/Man类的基础上,开发一个类用来判断,负责对Woman、Man中的方法进行判断: 1、打招呼,为什么需要多态 5-2,第一种解决方案,public class Judge publ

8、ic void judge(Man man) man.sayHello(); man.isFather(); public void judge(Woman woman) woman.sayHello(); woman.isMother(); public static void main(String args) Man lisi = new Man(“李四“,“男“); Woman lili = new Woman(“李丽“,“女“); Judge judge = new Judge(); judge.judge(lisi); judge.judge(lili); ,我继承于Human类,

9、是个男性 大家好,我是李四,是个男人 我继承于Human类,是个女性 大家好,我是李丽,是个女人,控制台输出,为什么需要多态 5-3,现在,升级人类,增加一种新类型:Boy 同时,Judge也负责对这类进行评估,为什么需要多态 5-4,如果在第一种解决方案的基础上去解决,我们需要如下两个步骤: 建立Boy类 修改Judge类,增加方法:judge(Boy boy),每增加一种新的人类型,都要修Judge类,增加相应的judge(评估)方法,代码的可扩展性及可维护性极差,能找到这个解决方案的弊端吗?,为什么需要多态 5-5,第二种解决方案使用多态,public class JudgeAll pu

10、blic void judge(Human human) human.sayHello(); public static void main(String args) JudgeAll judgeall = new JudgeAll(); judgeall.judge(lisi); judgeall.judge(lili); judgeall.judge(xiaoming); ,可以接收子类类型,根据实际创建的对象类型调用相应方法,我继承于Human类,是个男性 大家好,我是李四,是个男人 我继承于Human类,是个女性 大家好,我是李丽,是个女人 我继承于Human类,是个男孩,还没有成年,

11、控制台输出,使用多态之后,当需要增加新的子类类型时,无需更改Judge类,程序的可扩展性及可维护性增强,什么是多态,简单来说,多态是具有表现多种形态的能力的特征 同一个实现接口,使用不同的实例而执行不同操作,彩色打印机,打印机,黑白打印机,打印效果:彩色,打印效果:黑白,打印,打印,public class Human public void sayHello() System.out.println(“大家好,我是“ + name + “,是个“ + sex + “人“); ,如何实现多态,1、子类重写父类的方法 2、编写方法时,使用父类定义的方法 3、运行时,根据实际创建的对象类型动态决定

12、使用哪个方法,总结 2-1,给定如下Java代码,编译运行后,输出结果是什么?,class Base public String name; public Base() name = “Base“; public Base(String pName) name = pName; public void method() System.out.println(name); ,class Child extends Base public Child() super(“Child1“); name=“Child2“; ,public class Sample public static void

13、main(String args) Child c = new Child(); c.method(); ,Child2,控制台输出,1,2,3,总结 2-2,给定如下Java代码,编译运行后,输出结果是什么?,public class Human public void sayHello() System.out.println(“你好,我是人类“); ,public class Boy extends Human public void sayHello() System.out.println(“你好,我是男孩“); ,1,2,public class Test public stati

14、c void main(String args) Human t = new Boy (); t.sayHello(); ,控制台输出,你好,我是男孩,4.6.2 类的运行时多态,当不同的对象接受到相同的消息名(或者说当不同的对象调用相同的名称的成员函数)时,可能引起不同的行为(执行不同的的代码)。这种现象称为多态性. 多态包括编译时多态和运行时多态两种。 编译时多态和运行时多态的区别 。 编译时的多态,是指参数列表的不同, 来区分不同的函数, 在编译后, 就自动变成两个不同的函数名. 在运行时谈不上多态。 运行时多态:用到的是后期绑定的技术, 在程序运行前不知道,会调用那个方法, 而到运行时, 通过运算程序,动态的算出被调用的地址. 动态调用在继承的时候,方法名 参数列表完全相同时才出现运行时多态,

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


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

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