第04章 面向对象编程_07继承和多态
发布时间:2021-06-05
发布时间:2021-06-05
详细的java课件(全部)
第四章 面向对象编程
详细的java课件(全部)
本章主要内容4.1 4.2 4.3 4.4 4.5 4.6 4.7 4.8 4.9 简介 面向对象的基本概念 面向对象的基本语法 类和包 类的方法 对象 继承和多态 接口和抽象类 面向对象开发概念
详细的java课件(全部)
课程回顾定义类的方法的步骤是什么? 类中的一个方法如何调用类的另一个方法? 类中的一个方法如何调用另一个类的方法? 分别说明成员变量和局部变量的作用域。 如何给类的方法添加JavaDoc注释?
详细的java课件(全部)
本章目标掌握继承 掌握super关键字 掌握多态
详细的java课件(全部)
4.6 继承和多态
计算机语言设计犹如在 公园里漫步。我是说侏 罗纪公园 。 ——Larry Wall(Perl 语言之父)
详细的java课件(全部)
生活中的继承生活中,继承的例子随处可见动物 谁是父类? 谁是子类? 能说出继承的特点吗?
食草动物
食肉动物
继承需要符合的关系:is-a,父类更通用、子类更具体
详细的java课件(全部)
生活中的继承子类具有父类的一般特性(包括属性和行为),以及自身特殊的特性巴士是汽车吗? 卡车是汽车吗? 出租车是汽车吗? 汽车 引擎数量 外观颜色 刹车 加速 属性 行为
请问:出租车包 含哪些属性和行 为呢? 最大载客数量 报站 最大载重量 卸货 所属公司 最大载客数量 打发票
详细的java课件(全部)
4.6.1 类和类的继承类的设计其实是对现有世界的模仿 在继承中,一般常见的有属性继承,属性隐藏,方法继承,方法覆盖,方法重 载等技术。在Java语言中,用extends关键字来表示一个类继承了另一个类 在父类中只定义一些通用的属性与方法 子类自动继承父类的属性和方法,子类中可以定义特定的属性和方法 子类的构造方法中,通过super关键字调用父类的构造方法 方法重写后,通过super关键字调用父类的方法 在Java 中,所有的Java类都直接或间接地继承了ng.Object类
详细的java课件(全部)
如何实现继承 3-1在Java语言中,用extends关键字来表示一个类继承了另一个类,例如:public class Woman extends Human { //其余代码省略 其余代码省略 }
在父类中只定义一些通用的属性与方法,例如:public class Human { private String name; private String school; public Human(String name, String sex, int age){ //初始化属性值 初始化属性值 } public void canEat(){ } public void breath() { } }
详细的java课件(全部)
子类自动继承父类的属性和方法,子类中可以定义特定的属性和方法 如何实现继承 3-2public class Human{ private String name; // 教员姓名 private String sex;// 所在中心 public Human (String myName, String mySex) { //初始化属性值 初始化属性值 } public void sayHello() { //方法的具体实现 方法的具体实现 } 父类中的属性和方法可以被 } 子类继承
public class Father extends Human { public Father(String myName, String mySex) { super(myName, mySex); } public void sayHello(){ System.out.println(“你好
,我是爸爸 “你好,我是爸爸"); super.sayHello(); } } 由于sayHello()方法与父类的实 由于 方法与父类的实 现有所不同, 现有所不同,因此重写了该方 法
方法重写:子类和父类的方法具有相同的名称、参数列表、 方法重写:子类和父类的方法具有相同的名称、参数列表、返回类型
详细的java课件(全部)
如何实现继承 3-3子类的构造方法中,通过super关键字调用父类的构造方法public class Father extends Human { public Father(String myName, String mySex) { super(myName, mySex); 通过调用父类的构造方法, 通过调用父类的构造方法,完成 } 对属性值的初始化 }
方法重写后,通过super关键字调用父类的方法public class Father extends Human { public void sayHello(){ System.out.println(“你好,我是爸爸 “你好,我是爸爸"); super.sayHello(); } }
详细的java课件(全部)
一切类的“祖先”——Objectpublic class MyObject { //… }
在Java 中,所有的Java类都直接或间接地继承了ng.Object类public class MyObect extends Object { //… }
中调用MyObject对象 在Eclipse中调用 中调用 对象 的成员, 的成员,会自动弹出继承自 Object的所有方法 的所有方法
详细的java课件(全部)
4.6.1 类和类的继承函数的覆盖和重载的区别
详细的java课件(全部)
4.6.1 类和类的继承重载的情况下,子类的访问权限比父类要大。 参看课本例4.15 Man类: 用于测试Man类的程序:
详细的java课件(全部)
为什么需要多态 5-1在Woman/Man类的基础上,开发一个类用来判断,负责对Woman、Man中 的方法进行判断:1、打招呼
详细的java课件(全部)
为什么需要多态 5-2第一种解决方案public class Judge { public 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类,是个男性 大家好,我是李四,是个男人 我继承于Human类,是个女性 大家好,我是李丽,是个女人
控制台输出
详细的java课件(全部)
为什么需要多态 5-3现在,升级人类,增加一种新类型:Boy 同时,Judge也负责对这类进行评估
详细的java课件(全部)
为什么需要多态 5-4如果在第一种解决方案的基础上去解决,我们需要如下两个步骤:建立Boy类 修改Judge类,增加方法:judge(Boy boy)
能找到这个解决方案的弊端吗? 能找到这个解决方案的弊端吗?每增加一种新的人类型,都要修Judge类,增加相应的judge(评估) 方法,代码的可扩展性及可维护性极差
详细的java课件(全部)
为什么需要多态 5-5
第二种解决方案——使用多态
可以接收子类类型 public class JudgeAll { public void judge(Human human){ human.sayHello(); } 根据实际创建的对象类型 调用相应方法 public static void main(String[] args) { JudgeAll judgeal
l = new JudgeAll(); judgeall.judge(lisi); judgeall.judge(lili); judgeall.judge(xiaoming); 控制台输出 } }
我继承于Human类,是个男性 大家好,我是李四,是个男人 我继承于Human类,是个女性 大家好,我是李丽,是个女人
我继承于Human类,是个男孩,还没
使用多态之后,当需要增加新的子类类型时,无需更改Judge类,程序的 可扩展性及可维护性增强
详细的java课件(全部)
什么是多态
简单来说,多态是具有表现多种形态的能力的特征 同一个实现接口,使用不同的实例而执行不同操作打印机
打印 打印 黑白打印机 彩色打印机
打印效果: 打印效果:彩色
打印效果: 打印效果:黑白
详细的java课件(全部)
如何实现多态1、子类重写父类的方法 2、编写方法时,使用父类定义的方法 3、运行时,根据实际创建的对象类型动态决定使用哪个方法public class Human { public class Test { public void sayHello(){ System.out.println("大家好,我是" + name +public static void main(String[ ] args) { ", JudgeAll judgeall = new JudgeAll(); 是个" + sex + "人"); judgeAll.judge(new Boy()); } } } } public class Boy extends Human { public void sayHello(){ public System.out.println("我继承于Human类,是个男孩, class JudgeAll { public void judge(Human human){ 还没有成年"); human.sayHello(); } 1 } } }
3
2