一、多态的语法

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. 【好书推荐】《剑指Offer》之硬技能(编程题7~11)

    本文例子完整源码地址:https://github.com/yu-linfeng/BlogRepositories/tree/master/repositories/sword <[好书推荐]& ...

  2. 华为网络设备修改console密码

    user-interface con 0set authentication password cipher 新密码 有的版本为 <FW> system-view[FW] user-int ...

  3. source insight搭建python环境

    SI是一个受到广泛欢迎的代码阅读/编辑器,那么能不能用SI来进行python开发呢,经过一晚上的试验,终于实现了这一功能. 1.python的语法高亮 source insight 4.0版本已经默认 ...

  4. Python的filter方法实现筛选功能

    filter方法可以实现筛选,第一个参数是一个函数,返回值是True或者False,第二个参数可以是str.tuple.list,将后面的参数依次传递给函数,依次判断结果,留下结果为 True的.比如 ...

  5. Java之ArrayList类(集合)

    集合的由来 我们想存储多个数据,选择的容器可以是数组.而数组的长度是固定的,无法适应数据变化的需求.为了解决这个问题,Java提供了另一个容器 java.util.ArrayList 集合类,让我们可 ...

  6. JS表单内容垂直循环滚动

    参考博客:https://blog.csdn.net/yubo_725/article/details/52839493  大佬是真的厉害,保存一下,以方便后续使用 效果: 源码: <!DOCT ...

  7. docker面试题和解答(一)

    什么Docker Docker是一个容器化平台,它以容器的形式将您的应用程序及其所有依赖项打包在一起,以确保您的应用程序在任何环境中无缝运行. Docker与虚拟机有何不同 Docker不是虚拟化方法 ...

  8. 2019年跨越速递Java工程师笔试题

    1.下面哪个选项可以用于JSP页面之间传递对象(A C) A application B page C session D error  E response 评语:这道题考察的是对JSP内置对象的了 ...

  9. [译]Vulkan教程(30)深度缓存

    [译]Vulkan教程(30)深度缓存 Depth buffering 深度缓存 Introduction 入门 The geometry we've worked with so far is pr ...

  10. HashMap、HashTable 和 ConcurrentHashMap 线程安全问题

    一.HashMap HashMap 是线程不安全的. JDK 1.7 HashMap 采用数组 + 链表的数据结构,多线程背景下,在数组扩容的时候,存在 Entry 链死循环和数据丢失问题. JDK ...