一、多态的语法

1.关于多态中涉及到几个概念

(1)向上转型(upcasting)

子类型转换为父类型,又被称为自动类型转换

(2)向下转型(downcasting)

父类型转换为子类型,又被称为强制类型转换(需要加强制类型转换符)

(3)无论是向上转型还是向下转型,它们之间都必须有继承关系,否则编译是不通过的。

(4)Java中允许语法:子类型向父类型及逆行转化

2.过程:

(1)java程序分为编译和运行阶段

(2)先分析编译阶段,再分析运行阶段,编译无法通过,根本是无法运行的;

(3)编译阶段检查a2这个引用的数据类型为Animal46,由于Animal.class字节码中有move()方法,所以编译通过了,这个过程我i们称为静态绑定,编译阶段绑定,只有静态绑定成功后才会有后续的运行。

(4)程序运行阶段,JVM堆内存中真实创建的对象是Cat对象,那么以下程序在运行阶段一定会调用Cat对象的move()方法,此时发生了程序的静态绑定。运行阶段绑定。

(5)无论是Catc46类有没有重写move方法,运行阶段一定会调用的是Cat对象的move方法,因为底层真实的对象就是Cat对象。

(6)父类型引用指向子类型对象这种机制导致了存在编译阶段绑定和运行阶段绑定两种不同的形态/状态,这种机制可以成为一种多态语法机制。

package com.bjpowernode.java_learning;

​

public class D46_1_polymorphic {

  public static void main(String[] args) {

    //下面使用多态语法机制

    Animal46 a2 = new Cat46();//一个Animal46类型的引用指向了Cat46对象

    a2.move();//底层是Cat46对象,如果这个方法没重写,那么就会调用Animal的原始move方法

    //a2.catchMouse();//分析这行程序为什么不能调用?

    //因为编译阶段编译器检查a2的类型是Animal类型,从Animal.class字节码文件之中查找catchMouse

    //方法,最终没有找到该方法,导致静态绑定失败,没有绑定成功,也就是编译失败,更别谈运行了。

    /**

     * Animal和Cat之间存在继承关系,Animal是父类,Cat是子类

     * Cat是Animal合理的

     * new Cat()创建的对象类型是Cat,a2这个引用的数据类型是Animal,可见它们进行了类型转换

     * 子类型转换为父类型,称为向上转型。

     */   

  }

}

​

class Animal46{

  public void move() {

    System.out.println("动物们再行走");

  }

}

class Cat46 extends Animal46{

  public void move() {

    System.out.println("小猫在行走");

  }//重写函数

  //下面是小猫类特有的函数

  public void catchMouse() {

    System.out.println("小猫是会抓老鼠的");

  }

}

class Bird46 extends Animal46{

  public void move() {

    System.out.println("小鸟在飞翔");

  }

}

​

二、源码:

D46_1_polymorphic.java

地址:

https://github.com/ruigege66/Java/blob/master/D46_1_polymorphic.java​

2.CSDN:https://blog.csdn.net/weixin_44630050(心悦君兮君不知-睿)

3.博客园:https://www.cnblogs.com/ruigege0000/

4.欢迎关注微信公众号:傅里叶变换,个人公众号,仅用于学习交流,后台回复”礼包“,获取大数据学习资料

Java连载46-Java中的多态的更多相关文章

  1. 13、java中的多态

    1,多态的体现 父类的引用指向了自己的子类对象. 父类的引用也可以接收自己的子类对象.2,多态的前提 必须是类与类之间有关系.要么继承,要么实现. 通常还有一个前提:存在覆盖. 3,多态的好处 多态的 ...

  2. java中实现多态的机制是什么?

    多态性是面向对象程序设计代码重用的一个重要机制,我们曾不只一次的提到Java多态性.在Java运行时多态性:继承和接口的实现一文中,我们曾详细介绍了Java实现运行时多态性的动态方法调度:今天我们再次 ...

  3. 【Java基础】Java中的多态

    什么是多态 多态是一个对象的多种实现,是建立在继承的基础上的,即对象“人”,有老师和学生不同的实现,其实总结起来就是允许将子类类型的指针赋值给父类类型的指针. 多态的发生条件 多态发生的前提是:1. ...

  4. JAVA之旅(八)——多态的体现,前提,好处,应用,转型,instanceof,多态中成员变量的特点,多态的案例

    JAVA之旅(八)--多态的体现,前提,好处,应用,转型,instanceof,多态中成员变量的特点,多态的案例 学习是不能停止的 一.多态 我们今天又要学习一个新的概念了,就是多态,它是面向对象的第 ...

  5. “全栈2019”Java第五十八章:多态中方法返回类型可以是子类类型

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

  6. Java 中的多态,一次讲个够之接口实现关系中的多态

    上文还没有写完,这一篇继续 Java 中的多态,一次讲个够之继承关系中的多态 https://www.cnblogs.com/qianjinyan/p/10824576.html 接口实现关系,和继承 ...

  7. 通过实例聊聊Java中的多态

    Java中的多态允许父类指针指向子类实例.如:Father obj=new Child();  那么不禁要发问?? 使用这个父类型的指针访问类的属性或方法时,如果父类和子类都有这个名称的属性或方法,哪 ...

  8. Java中实现多态的条件是什么

    java中实现多态需要三个条件: 1,需要有继承关系的存在. 2,需要有方法的重写. 3,需要有父类的引用指向子类对象.

  9. 深度分析:理解Java中的多态机制,一篇直接帮你掌握!

    Java中的多态 1 多态是什么 多态(Polymorphism)按字面的意思就是"多种状态".在面向对象语言中,接口的多种不同的实现方式即为多态.用白话来说,就是多个对象调用同一 ...

  10. Java中的多态方法

    public class Main { public void test(Object o) { System.out.println("Object"); } public vo ...

随机推荐

  1. C#后台架构师成长之路-Orm篇体系

    成为了高工,只是完成体系的熟练,这个时候就要学会啃一些框架了... 常用Orm底层框架的熟悉: 1.轻量泛型的DBHelper,一般高工都自己写的出来的 2.EF-基于Linq的,好好用 3.Keel ...

  2. Linux发行版的系统目录名称命名规则以及用途

    linux各种发行版都遵循LSB(Linux Stadards Base)规则,使用一致的相关的基础目录名称,使用根目录系统结构(root filesystem),使用FHS(Files Hierar ...

  3. 如何通过 subprocess 持续获取输出内容

    在实际应用中会用到subprocess的Popen方法执行一些命令,而我们需要通过执行这个命令的来获取输出进行一些信息记录或者分析使用,如果是很快就可以执行完的那还好,有时需要持续跟踪内容的输出,比如 ...

  4. Appium 1.15.1版本的appium-doctor不是内部或者外部命令的问题

    先讲一下整个app自动化环境的部署过程: 1.安装appium 2.安装nodejs 3.查看appium的环境是否完成 问题:安装appium和nodejs都没啥问题,直接到对应的官网下载然后安装即 ...

  5. openstack_dashboard无法获取nova

    问题描述: 今天打开openstack的dashboard准备创建实例,结果计算节点每一项展开都无法获取nova 之前已经把nova搞好了并没有什么问题,怎么突然就服务也起不了了 查看了一下nova服 ...

  6. Keystone安装与配置

    一.实验目的: 1.掌握OpenStack环境搭建的基础工作 2.掌握keystone的安装与配置方法 3.掌握keystone基础接口的调用方法 二.实验步骤: 1.利用最初创建的快照克隆两台Cen ...

  7. Java之IO初识(字节流和字符流)

    IO概述 生活中,你肯定经历过这样的场景.当你编辑一个文本文件,忘记了 ctrl+s ,可能文件就白白编辑了.当你电脑上插入一个U盘,可以把一个视频,拷贝到你的电脑硬盘里.那么数据都是在哪些设备上的呢 ...

  8. FFT/NTT中档题总结

    被DeepinC%怕了,把一些题放到这里来 T1Normal 其实这道题放到中档题也不太合适,个人感觉真的很难,机房里好像都是颓的题解 因为期望的可加性,把每个点的贡献单独处理,即求期望深度 考虑$y ...

  9. 一个适合于.NET Core的超轻量级工作流引擎:Workflow-Core

    一.关于Workflow-Core 近期工作上有一个工作流的开发需求,自己基于面向对象和职责链模式捣鼓了一套小框架,后来在github上发现一个轻量级的工作流引擎轮子:Workflow-Core,看完 ...

  10. 多线程七 AQS

    一 . 简介AQS AQS简介 在同步组件的实现中,AQS是核心部分,同步组件的实现者,通过使用AQS提供的模板方法 实现同步组件语义 AQS实现了对同步状态的管理以及阻塞线程进行排队,等待通知等等一 ...