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——第三章 多态的更多相关文章

  1. java基础(三章)

    java基础(三章) 一.基本if结构 1.流程图 l  输入输出 l  判断和分支 l  流程线 1.1              简单的if条件判断 if(表达式){            //表 ...

  2. “全栈2019”Java多线程第三章:创建多线程之实现Runnable接口

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...

  3. “全栈2019”Java异常第三章:try代码块作用域详解

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java异 ...

  4. 20165233 Java第二、三章学习总结

    2017-2018-2 <Java程序设计>第二周学习总结 教材学习内容总结 第二.三章 ch2 标识符与关键字 基本数据类型: 逻辑类型:boolean 整数类型:int.byte.sh ...

  5. Java oop第05章_多态、接口

    一. 为什么需要接口? Java中当一个类继承父类时,最多也只能继承一个父类,扩展性会受到一定的限制,为了弥补这一缺陷,Java又提供了一种新的引用数据类型分类,叫接口. 一个类只能继承一个父类,但可 ...

  6. java第三章多态

    多态: 多态不仅可以减少代码量,还可以提高代码的扩展和可维护性 (通过一个方法可以对所有所需方法一个运用)多态具体表现多种形态能力的特征,同一个实现接口使用不同实例而执行不同的操作 实现多态的三个条件 ...

  7. Java oop 第13章_多线程

    第13章_多线程 一.   多线程相关的概念:  程序:由某种编程语言开发可执行某些功能的代码组合,它是静态的概念.   进程:当程序被执行时的过程可以理解为讲程序从外存调入内存的过程,会为每一个程序 ...

  8. java oop第09章_JDBC02(CRUD操作)

    第09章_JDBC02(CRUD操作) CRUD(CREATE . RETIVE . UPDATE . DELETE)增删改查. DAO中会提供一些CRUD操作方法,调用者可以通过调用这些方法完成相应 ...

  9. java面向对象编程--第九章 多态和抽象

    9.1多态 在生物学中,是指一个生物或物种可以有多种不同的形式或阶段: 在OOP中,多态是指一个对象有多种形式的能力. 多态可以说是面向对象编程的精髓所在.java中之所以引入多态的概念,原因之一是它 ...

随机推荐

  1. CentOS安装chrome-浏览器

    首先,在CentOS中安装软件,通过yum命令来安装软件,就要在系统中的软件源中添加软件源节点,即在目录./etc/yum.repos.d/下的CentOS-Base.repo文件中做修改:在控制台C ...

  2. JSP禁用缓存的方式 response.setHeader( "Pragma", "no-cache" ); setDateHeader("Expires", 0);

    JSP禁用缓存的方式    使用服务器端控制AJAX页面缓存:        response.setHeader( "Pragma", "no-cache" ...

  3. 在一个服务中实现 多个契约 和终结点 z

    一个服务作为一系列终结点被定义的.每个终结点都有一个地址,绑定和契约.契约就是暴露终结点能力的.地址就是这些应用或服务从网络的哪个地址可找到,契约是关于如何访问他们的. 在终结点和契约间有一对多的关系 ...

  4. Python3基本数据类型(六、字典)

    一.集合介绍 Python set是基本数据类型的一种集合类型,它有可变集合(set())和不可变集合(frozenset)两种.集合是一个无序的,不重复的数据组合,主要作用为:去重(把一个列表变成集 ...

  5. PS软件怎么把视频转成gif动态图?

    PS软件怎么把视频转成gif动态图?Adobe PhotoShop软件的最新版本是可以编辑视频的,并且可以将视频转换为GIF动态图,使用也很简单,下面分享ps制作gif动态图的教程,需要的朋友可以参考 ...

  6. simple2.py

    #coding: utf-8 import xlsxwriter workbook = xlsxwriter.Workbook('chart.xlsx') worksheet = workbook.a ...

  7. 关于git的认识与想法

    1.什么是git:                Git是一款免费.开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目.Git的读音为/gɪt/.               Git是一个 ...

  8. 剑指offer23 从上往下打印二叉树

    没有把队列的头部弹出,出现内存错误:

  9. 将psd格式批量转换成jpg或png格式(C#自制软件)

    此项目基于.net framework 4.0 将psd格式批量转换成jpg或png格式. 链接:https://pan.baidu.com/s/16IEjX0sHaY9H3Ah7mv6IPQ 提取码 ...

  10. 写在归程路上——2018ROBOCUP机器人世界杯中国赛

    写入自强队名单一年,认识Daniel十个月,第二次代表上海大学参加国赛,这一次是在浙江绍兴.坐在返沪的车上,心里担心着作业和明天的早课,写这篇博文来打发打发时间. ROBOCUP两个半比赛日,项目主要 ...