Java OOP——第三章 多态
1、多态:(polymorphism):
|
是具有表现多种形态能力的特征; |
|
|
(专业化的说法:)同一个实现接口(引用类型),使用不同的实例而执行不同的操作 |
|
|
指一个引用(类型)在不同情况下的多种状态。也可以理解成:多态是指通过指向父类的指针,来调用在不同子类中实现的方法。 |
|
|
多态是同一个行为具有多个不同表现形式或形态的能力, 多态就是同一个接口,使用不同的实例而执行不同操作,多态性是对象多种表现形式的体现。 |
|
|
多态的优点: 1. 消除类型之间的耦合关系 2. 可替换性 3. 可扩充性 4. 接口性 5. 灵活性 6. 简化性 7、可以减少类中代码量 8、可以提高代码的拓展性和可维护性 |
多态存在的三个必要条件: 继承 重写 父类引用指向子类对象 |
2、实现多态:
|
实现多态的三个要素: 编写具有继承关系的父类和子类; 子类重写父类方法; 使用父类的引用指向子类的对象; |
|||||||
|
实现多态的两种方式(继承和接口): |
|||||||
|
使用父类作为方法形参实现多态: Eg:使用多态优化主人给宠物喂食; |
使用父类作为方法返回值实现多态:
|
||||||
|
示例(错误): |
|||||||
|
Eg1:多态的形式1:父类Pet做形参,子类做实参; |
|||||||
|
狗类(子类): 企鹅类(子类): 猫类(子类): 主人类: |
|||||||
|
测试类:
输出结果: |
|||||||
|
Eg2:多态的形式2:父类做引用类型,子类实例化; |
|||||||
|
测试类(其他类见eg1)
|
运行结果(注意蓝色部分):
|
||||||
|
Eg3:父类作为方法返回值,自类实例化,类型自动转换; |
|||||||
|
主人类(在eg1的主人类上增加代码):
|
测试类(其他类见eg1):
运行结果:
|
||||||
3、转换:
|
向上转型:子类到父类的转换; //自动转型 Pet pet=new Dog(); |
Eg:向下转换: 主人类: public class Master { public void play(Pet pet){ if (pet instanceof Dog) { //如果传入的是狗狗 Dog dog = (Dog) pet; dog.catchingFlyDisc(); }else if (pet instanceof Penguin) { //如果传入的是企鹅 Penguin pgn = (Penguin) pet; pgn.swimming(); } } } |
|
|
向下转型:父类到子类的转换(强制类型转换): ●instanceof运算符:instanceof通常和强制类型转换结合使用 语法: 对象 instanceof 类或接口 |
||
|
Eg1:实现宠物玩的方法: |
||
|
子类和宠物类: |
||
|
主人类:
|
测试类:
|
输出结果:
|
|
Eg2: public class Test { public static void main(String[] args) { show(new Cat()); // 以 Cat 对象调用 show 方法 show(new Dog()); // 以 Dog 对象调用 show 方法 Animal a = new Cat(); // 向上转型 a.eat(); // 调用的是 Cat 的 eat Cat c = (Cat)a; // 向下转型 c.work(); // 调用的是 Cat 的 catchMouse } public static void show(Animal a) { a.eat(); // 类型判断 if (a instanceof Cat) { // 猫做的事情 Cat c = (Cat)a; c.work(); } else if (a instanceof Dog) { // 狗做的事情 Dog c = (Dog)a; c.work(); } } } abstract class Animal { abstract void eat(); } class Cat extends Animal { public void eat() { System.out.println("吃鱼"); } public void work() { System.out.println("抓老鼠"); } } class Dog extends Animal { public void eat() { System.out.println("吃骨头"); } public void work() { System.out.println("看家"); } } |
||
4、 附加:
|
●父类引用指向子类对象,引用对象只能调用子类重写父类的方法并不能调用子类特有的方法。不然会报错; ●实现多态的条件:继承的存在、子类重写父类的方法、父类引用变量指向子类对象; |
![]() |
|
●子类转换为父类(将一个父类的引用指向一个子类对象),称为向上转型; ●一个类继承父类,且都有方法重载的过程,在调用的时候如果该子类有该方法,则用该子类方法,如果该子类没有该方法则调用父类的该方法; ●继承体系下,如果没有用super关键字指定调用属性和方法,先在子类中,再去父类找; ●Java中的继承和多态。用父类声明,实例化父类对象,调用的是父类中的方法。 |
|
用子类声明,实例化子类,调用的是子类中的方法。 用父类声明,实例化子类,调用的是子类中的重写方法。 |
|
●子类对象赋值给父类引用,此时调用的方法是被子类重写的方法。 |
Java OOP——第三章 多态的更多相关文章
- java基础(三章)
java基础(三章) 一.基本if结构 1.流程图 l 输入输出 l 判断和分支 l 流程线 1.1 简单的if条件判断 if(表达式){ //表 ...
- “全栈2019”Java多线程第三章:创建多线程之实现Runnable接口
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...
- “全栈2019”Java异常第三章:try代码块作用域详解
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java异 ...
- 20165233 Java第二、三章学习总结
2017-2018-2 <Java程序设计>第二周学习总结 教材学习内容总结 第二.三章 ch2 标识符与关键字 基本数据类型: 逻辑类型:boolean 整数类型:int.byte.sh ...
- Java oop第05章_多态、接口
一. 为什么需要接口? Java中当一个类继承父类时,最多也只能继承一个父类,扩展性会受到一定的限制,为了弥补这一缺陷,Java又提供了一种新的引用数据类型分类,叫接口. 一个类只能继承一个父类,但可 ...
- java第三章多态
多态: 多态不仅可以减少代码量,还可以提高代码的扩展和可维护性 (通过一个方法可以对所有所需方法一个运用)多态具体表现多种形态能力的特征,同一个实现接口使用不同实例而执行不同的操作 实现多态的三个条件 ...
- Java oop 第13章_多线程
第13章_多线程 一. 多线程相关的概念: 程序:由某种编程语言开发可执行某些功能的代码组合,它是静态的概念. 进程:当程序被执行时的过程可以理解为讲程序从外存调入内存的过程,会为每一个程序 ...
- java oop第09章_JDBC02(CRUD操作)
第09章_JDBC02(CRUD操作) CRUD(CREATE . RETIVE . UPDATE . DELETE)增删改查. DAO中会提供一些CRUD操作方法,调用者可以通过调用这些方法完成相应 ...
- java面向对象编程--第九章 多态和抽象
9.1多态 在生物学中,是指一个生物或物种可以有多种不同的形式或阶段: 在OOP中,多态是指一个对象有多种形式的能力. 多态可以说是面向对象编程的精髓所在.java中之所以引入多态的概念,原因之一是它 ...
随机推荐
- TopcoderSRM679 Div1 250 FiringEmployees(树形dp)
题意 [题目链接]这怎么发链接啊..... 有一个 \(n\) 个点的树,每个点有点权(点权可能为负) ,求包含点\(1\)的最 大权连通子图(的权值和) . \(n \leqslant 2500\) ...
- jq on方法绑定多个事件
一.jquery为多个选择器绑定同一个事件 $("#start,#end").on("click",function(){ alert("The pa ...
- mongodb 32为安装
启动命令:mongod --dbpath D:\MongoDB\data --logpath c:\MongoDB\log\mongod.log --journal 安装引擎: mongod --db ...
- 【CSAPP-南大视频】Week1-计算机系统概述
本笔记基于中国大学Mooc <计算机系统基础(一):程序的表示.转换与链接>课程,由 南京大学袁春风教授授课. 教材<深入理解计算机系统> 课程总目标:理解计算机是如何生成和运 ...
- 我的SublimeText配置
我的SublimeText改键 [ /** * 我的改键 */ // f1控制中心:f2快速查找:f3查找下一个: { "keys": ["f1"], &quo ...
- matlab练习程序(广度优先搜索BFS、深度优先搜索DFS)
如此经典的算法竟一直没有单独的实现过,真是遗憾啊. 广度优先搜索在过去实现的二值图像连通区域标记和prim最小生成树算法时已经无意识的用到了,深度优先搜索倒是没用过. 这次单独的将两个算法实现出来,因 ...
- CompletionService的poll方法
1.poll():马上返回完成的任务,若没有,则返回null 2.poll(long timeout, TimeUnit unit): 等待timeout时间,如果大于最短任务完成时间,则获取任务结果 ...
- 笨办法学Python(三十九)
习题 39: 列表的操作 你已经学过了列表.在你学习“while 循环”的时候,你对列表进行过“追加(append)”操作,而且将列表的内容打印了出来.另外你应该还在加分习题里研究过 Python 文 ...
- ul自适应li问题
内容提要: li浮动时ul高度为0,解决ul自适应高度的几种方法 在网页设计中,常常需要对li标签做浮动效果,但是在不同浏览器中会遇到兼容性问题,比如IE中会出现ul高度为0的情况,是效果不能达到预期 ...
- 【转】ssh timed out 超时解决方案
转自:http://www.cnblogs.com/niutouzdq/p/4091268.html 在使用阿里云ECS服务器的时候,winsftp经常被服务器断开,想必是过一会没有操作,防火墙喜欢对 ...

















