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中之所以引入多态的概念,原因之一是它 ...
随机推荐
- sublime Error executing: /usr/bin/security dump-trust-settings -d
sublime text2突然crash,无法简单粗暴的关闭,就开始认真解决这个问题. 问题: 参考文献:https://github.com/wbond/package_control/issues ...
- HttpComponents
一 概述 1.HttpComponents的作用 HttpComponents的作用是模拟浏览器获取网页内容. 二 使用 1.使用HttpComponents需要先导入架包. 2.使用 Closeab ...
- css样式学习小知识
1. 使用百分比设置宽高 自适用宽高的,有分割的区域,可以适用百分比:30% 70% 如果有一部分是固定的宽度或者高度,可以使用:height: calc( 100% - 36px ); 2. inp ...
- vue 路由权限
import Vue from 'vue' import Router from 'vue-router' import HelloWorld from '@/components/HelloWorl ...
- flash8中利用遮罩制作图片切换效果
http://www.56.com/w73/play_album-aid-8642763_vid-NDY5ODU2Mzg.html
- JQuery Tips
另一篇文章 JavaScript Tips 1. 获取span标签的值需要用text(); 2. datepicker控件的‘setDate’属性可用于设置默认值: 3. 使用parseFloat转换 ...
- java 将long类型的数值转无符号数
由于JAVA中基本数据类型均为有符号数,而且最大数据类型long为8字节假如long为负数时,最高位为1,转为无符号数时会超出long的取值范围,所以转换规则如下: 方法: public static ...
- Java框架安全
(一)Mybatis注入问题 Mybatis是目前比较常用的ORM的框架,一般与SpringMVC框架整合较多,但使用不当会有SQL注入的风险. Mybatis里mapper中SQL语句的写法支持两种 ...
- 【Leetcode】【Medium】Single Number II
Given an array of integers, every element appears three times except for one. Find that single one. ...
- 【Leetcode】【Easy】Remove Element
Given an array and a value, remove all instances of that value in place and return the new length. T ...