Think in Java之多态

这篇具有很好参考价值的文章主要介绍了Think in Java之多态。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

多态通过分离做什么和怎么做,从另一角度将接口和实现分离开来。多态方法调用允许亿欧汇总类型表现出与其他相似类型之间的区别。

向上转型

导出类从基类继承而来,所以存在于基类中的接口也必定存在于导出类中。将导出类转换为基类称作“向上转型”,上是按照类的继承关系为方向的。

增加扩展性

当我们想调用基类的某个方法时,不同的导出类都会有不同的行为,只需覆盖该方法即可。当有新的导出类时我们不必定义新方法去做事情直接覆盖基类的方法版本编译器自动帮我们定位到时机调用的导出类的方法。

我们只在基类中写一个简单方法, 它只接受基类类型为参数,而不是特殊的导出类,也就是说在调用方法的时候不考虑导出类的存在,编写的代码只是和基类打交道,具体的行为编译器帮我们自动判断该调用哪个方法版本。

方法绑定

编译器如何得知这个基类类型是哪个导出类类型呢?比如DShape有三个导出类:Circle,Rect,Triangle;并且这三个导出类都复写了父类的方法,编译器如何得知真实的类型是这三个中的哪个呢?

编译器也无法得知。

将一个方法调用同一个方法主体关联起来被称作绑定。在程序执行前进行的绑定叫做前期绑定(由编译器和连接程序实现),该绑定方式是面向过程语言无默认的绑定方式,C语言只有一种绑定方式就是前期绑定;多态其实就是因为前期绑定的问题而不知道该调用哪个方法版本,还有一种绑定叫做后期绑定:在运行时根据对象的类型进行绑定,这种绑定方式的实现是通过在对象中增加“某些类型信息”来实现的。

Java中除了stratic方法和final方法(private方法也属于final方法)外,其他方法都属于后期绑定。final方法可以有效的关闭“动态绑定”,告诉编译器不需要动态绑定因为其不会被复写也就不需要运行时绑定。

多态的坑

与其说是多态的坑不如说是不了解多态

private方法

当我们在基类中定义一个draw方法修饰符为private。在导出类中再定义一个同名的公开的draw方法。使用多态调用draw方法时会发现调用的是基类的方法。

原因

由于private方法会被编译器认为是final方法,采用的是前期绑定的方式对导出类是屏蔽的;子类的draw方法是一个全新的方法,既然基类中的draw方法对子类不可见,也就不能发生重载覆盖,在加上其声明类型为基类,所以调用的是基类的版本

结论

只有非private的方法才会被覆盖。在导出类中,对于基类的private方法采用不同的方法名字。

static方法

和上面类似,导出类和基类定义同名的静态方法,使用多态时调用的方法版本是基类的static方法。

原因

静态方法是与类绑定的而不时和单个对象绑定的。

结论

static方法不具有多态性

非final方法

private方法也即final方法。要保证在构造器中调用的方法是final的,比如在基类构造器中调用的方法是可被覆盖的那么就会出现问题,很可能可被覆盖的方法此时需要的变量还未初始化(对象构造顺序)因此出现奇怪现象。

所以要保证构造器中调用的方法是不可被覆盖的,也就是final的

Field的访问

向上转型过程中,域访问操作都由编译器自动解析,因此也属于前期绑定。

使用多态访问同名属性时访问的是基类的属性(动态绑定只针对与方法调用);在方法中访问属性时会用到动态绑定,默认的域是实际类型,如果想访问基类的属性需要在方法中使用super.属性

转载于:Think in Java之多态 - 掘金 (juejin.cn)

获奖者已经产生:

Think in Java之多态,java,开发语言

添加博主微信领奖:WJY-WTC

Think in Java之多态,java,开发语言文章来源地址https://www.toymoban.com/news/detail-763490.html

到了这里,关于Think in Java之多态的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Java0基础学Java第八颗】 -- 继承与多态 -- 多态

    通俗来说就是多种形态, 具体点就是去完成某个行为,当不同的对象去完成时会产生出不同的状态 。 就比如打印机,彩色打印机和黑白打印机,打印出的效果一个是彩色,一个是黑白。 即: 同一件事情,发生在不同对象身上,就会产生不同的结果 。 在Java中要实现多态,

    2024年02月04日
    浏览(44)
  • 【Java】Java中的多态

    在Java中,多态是面向对象编程中的一个重要概念,它 允许不同类型的对象对同一方法进行不同的实现 。具体来说, 多态性指的是通过父类的引用变量来引用子类的对象,从而实现对不同对象的统一操作 。 例如:狗和猫都是动物,动物共同的行为都有吃这个动作,而狗可以

    2024年02月10日
    浏览(41)
  • Java面向对象多态

    目录 多态概述 Java 多态包括以下三种方式 方法重写(Override) 向上转型(Upcasting) 实现多态 Java 多态是指同一种类型的对象,在不同的情况下有着不同的状态和行为。它是基于继承、重写和向上转型等特性实现的,多态是面向对象编程的三大特征之一,其他两个分别是封装

    2023年04月13日
    浏览(49)
  • Java入门5(多态)

    编译时的多态:方法重载 运行时的多态:动态绑定 类之间要有继承关系 要出现方法重写 父类的引用指向了子类的对象 为什么需要转型 ​当使用多态方式调用方法时,首先检查父类中是否有该方法,如果没有,则编译错误,也就是说,不能调用子类拥有 而父类没有的方法,

    2023年04月10日
    浏览(24)
  • Java多态与重写

    Java继承与组合 你知道为什么会划分数据类型吗?—JAVA数据类型与变量 10 > 20 10 / 0 == 0等于串联小灯泡?—JAVA运算符 你真的知道怎样用java敲出Hello World吗?—初识JAVA 现实生活中,但我们完成某一个同样的行为,当不同的对象去完成时会产生出不同的状态.比如说吃食物,当猫去完

    2023年04月15日
    浏览(47)
  • (java)继承和多态 (详解)

    目录 1 继承 1.1为什么需要继承 1.2 继承概念 1.3 继承的语法 1.4 父类成员访问  1.4.1 子类中访问父类的成员变量 1.4.2 子类中访问父类的成员方法   1.5 super 1.6 子类构造方法 1.7 super和this 1.7.1 this 1.7.2 super和this  1.8 再谈初始化 1.9 继承方式 1.10 继承与组合 2 多态 2.1 多态

    2024年02月03日
    浏览(41)
  • java特征:多态性

    对象的多态性 多态性,是面向对象中最重要的概念,在Java中的体现: 对象的多态性:父类的引用指向子类的对象 格式:(父类类型:指子类继承的父类类型,或者实现的接口类型) 举例: 对象的多态:在Java中,子类的对象可以替代父类的对象使用。所以,一个引用类型变

    2024年02月12日
    浏览(32)
  • Java之继承和多态

    1.  为什么需要继承 先看下代码 // Dog.java public class Dog { string name ; int age ; float weight ; public void eat (){ System . out . println ( name + \\\" 正在吃饭 \\\" ); } public void sleep (){ System . out . println ( name + \\\" 正在睡觉 \\\" ); } void Bark (){ System . out . println ( name + \\\" 汪汪汪 ~~~\\\" ); } } // Cat.Java public class Ca

    2024年04月23日
    浏览(32)
  • Java之多态

    作者简介: zoro-1,目前大一,正在学习Java,数据结构等 作者主页:zoro-1的主页 欢迎大家点赞 👍 收藏 ⭐ 加关注哦!💖💖 继承关系向上转型或向下转型 子类重写父类的方法 通过父类对象的引用调用这个重写的方法 (完成上面三部分,就会发生动态绑定,动态绑定是多态

    2024年02月13日
    浏览(27)
  • JAVA-多态

    文章目录 1.多态的概念 2.多态的实现条件 3.重写 总结 什么是多态?  通俗来说,就是多种形态, 具体点就是去完成某个行为,当不同的对象去完成时会产生出不同的状态 。 定义一个基类Animal和两个派生类cat,dog,派生类重写基类中的eat()方法 定义Test测试类,用来测试方法

    2024年02月04日
    浏览(29)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包