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中之所以引入多态的概念,原因之一是它 ...
随机推荐
- CSS基础语法与选择器
CSS基础 语法 : <head> <style type="text/css"> 选择器(即修饰对象){ 修饰属性:属性值; 修饰属性:属性值; } &l ...
- 图片小精灵 & 解决同时给一个元素设置背景问题 &jq登录注册切换
图片小精灵,当有整张图片时可以通过图片小精灵设置图标. 例如 <!DOCTYPE html> <html> <head> <meta charset=&quo ...
- 原生js获取手机定位信息
<script type="text/javascript"> function Location() {}; Location.prototype.getLocati ...
- 30分钟LINQ教程 【转载】
原文地址:http://www.cnblogs.com/liulun/archive/2013/02/26/2909985.html 在说LINQ之前必须先说说几个重要的C#语言特性 一:与LINQ有 ...
- Angular5+ 自定义表单验证器
Angular5+ 自定义表单验证器 Custom Validators 标签(空格分隔): Angular 首先阐述一下遇到的问题: 怎样实现"再次输入密码"的验证(两个cont ...
- VS LNK2019 解决办法之一
LNK2019: unresolved external symbol _main referenced in function __main 有人说这是因为静态动态引用引起的,但是!这些都没有解决我 ...
- 使用字面量或者绑定变量在HANA Studio里执行SQL语句
在SAP note 2000002 – FAQ: SAP HANA SQL Optimization里提到了SQL语句的两种执行方式,具体差异体现在where语句里搜索条件的指定方式上. 所谓Lite ...
- python入门7 字符串操作
字符串操作 #coding:utf-8 #/usr/bin/python """ 2018-11-03 dinghanhua 字符串操作 ""&quo ...
- leetcode第一刷_Plus One
这种相似大整数的处理的问题还是比較常见的,这道题应该是很easy的版本号. 题目的要求是这种,输入的vector靠前的位置是数字的高位.因此应该先求出长度.然后从后面往前算.维护一个变量保存进位.这我 ...
- ACM-ICPC(9/25)
DP专题 记忆化搜索与递推(方式) DAG模型 记忆化搜索: 用d[状态] 的特殊值表示是否计算过. 用vis[状态]是否访问过 DAG模型: 矩形嵌套:d(i) 以 i 结点开始的最长长度, 存在 ...

















