一、多态的语法

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. php7深入理解匿名函数和回调函数

    匿名函数是没有名称的函数,可以将函数赋值给变量,再调用使用,回调函数是指作为一个参数值传值另外一个函数使用的函数. //匿名函数 没名称的函数 $a=function (){echo "ww ...

  2. WCF、WebAPI、WCFREST、WebService的区别

    目录导航: 1. WCF 2. WebAPI 3. WebService 4. WCFREST 5. 如何选择WCF.WebAPI.WCFREST.WebService 1.WCF 这个是基于SOAP ...

  3. Where is the kernel documentation?; Ubuntu 上如何安装 linux 内核文档;fedora 上如何安装linux内核文档?

    有时候,linux内核文档对我们很重要,我们可以在linux系统中安装,并及时查看: 参考链接:https://askubuntu.com/questions/841043/where-is-the- ...

  4. 【西北师大-2108Java】第十一次作业成绩汇总

    [西北师大-2108Java]第十一次作业成绩汇总 作业题目 面向对象程序设计(JAVA) 第13周学习指导及要求 实验目的与要求 (1)掌握事件处理的基本原理,理解其用途: (2)掌握AWT事件模型 ...

  5. 关于操作服务器上tomcat的常用linux指令

    ll:     列出目录下的所有文件 cd:切换目录 pwd:显示目前的目录 grep  xxxxxx catalina.out    查询文件中关于某个信息的内容 grep -3  xxxxxxca ...

  6. 在ASP.NET中备份数据库以及还原(不成熟)

    using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threa ...

  7. WebShell代码分析溯源(三)

    WebShell代码分析溯源(三) 一.一句话变形马样本 <?php $g = array('','s');$gg = a.$g[1].ser.chr('116');@$gg($_POST[ge ...

  8. Emoji 映射编码

    Emoji官网:https://emojipedia.org/ Name   Unified DoCoMo KDDI Softbank Google Wechat   black sun with r ...

  9. Java生鲜电商平台-商城优惠券设计要点复盘与总结

    Java生鲜电商平台-商城优惠券设计要点复盘与总结 Java生鲜电商平台本文将从优惠券设计用户端,需求端,业务流程全方案解析优惠券设计方案 为什么要设计优惠券 设计优惠券的核心:拉新和促活 新产品上线 ...

  10. Python 函數 Function

    函數最初被設計出來,是用來減輕重複 coding 一段相同的代碼,這之間只有代碼 (方法,Method) 的重用,但還沒有物件導向OO整個Object 的屬性與方法被封裝重用的概念. 函數的定義很簡單 ...