java 多态[通俗易懂]

java 多态[通俗易懂]多态的情况下,子父类存在同名的成员变量或成员方法优先调用问题1.多态的情况下,子父类存在同名的成员变量时,默认访问的是父类的成员变量数据.2.多态的情况下,子父类存在同名的非静态函数的时候,默认是调用子类的成员函数.3.多态的情况下,子父类存在同名的静态函数时,默认是调用父类的成员函数.原因:java多态的实现,首先说成员变量,因为在java中,一个对象实例是存储在堆中的,而这个对象包含的内容有对象头,对象体以及对其字节,首先对象头存放的是对象运行时的数据,像是hashcode,锁标识,类型指针,

大家好,又见面了,我是你们的朋友全栈君。

1.概述

1.多态概述

所谓多态就是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定,即一个引用变量倒底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类中实现的方法,必须在由程序运行期间才能决定。因为在程序运行时才确定具体的类,这样,不用修改源程序代码,就可以让引用变量绑定到各种不同的类实现上,从而导致该引用调用的具体方法随之改变,即不修改程序代码就可以改变程序运行时所绑定的具体代码,让程序可以选择多个运行状态,这就是多态性。

2.多态现实意义理解:

  • 现实事物经常会体现出多种形态,如学生,学生是人的一种,则一个具体的同学张三既是学生也是人,即出现两种形态。
  • Java作为面向对象的语言,同样可以描述一个事物的多种形态。如Student类继承了Person类,一个Student的对象便既是Student,又是Person。

3.多态的定义与使用格式

定义格式:父类类型 变量名=new 子类类型();

2.多态中成员的特点

1.多态成员变量:编译运行看左边

   Fu f=new Zi();
   System.out.println(f.num);//f是Fu中的值,只能取到父中的值

2.多态成员方法:编译看左边,运行看右边

   Fu f1=new Zi();
   System.out.println(f1.show());//f1的门面类型是Fu,但实际类型是Zi,所以调用的是重写后的方法。

3.多态的转型

多态的转型分为向上转型和向下转型两种:

  • 向上转型:多态本身就是向上转型过的过程
		 使用格式:父类类型 变量名=new 子类类型();
         适用场景:当不需要面对子类类型时,通过提高扩展性,或者使用父类的功能就能完成相应的操作。
  • 向下转型:一个已经向上转型的子类对象可以使用强制类型转换的格式,将父类引用类型转为子类引用各类型
 		 使用格式:子类类型 变量名=(子类类型) 父类类型的变量;
         适用场景:当要使用子类特有功能时。

5.多态的情况下,子父类存在同名的成员变量或成员方法优先调用问题

1.多态的情况下,子父类存在同名的成员变量时,默认访问的是父类的成员变量数据.
2.多态的情况下,子父类存在同名的非静态函数的时候,默认是调用子类的成员函数.
3.多态的情况下,子父类存在同名的静态函数时,默认是调用父类的成员函数.

原因:
java多态的实现,首先说成员变量,因为在java中,一个对象实例是存储在堆中的,而这个对象包含的内容有对象头,对象体以及对其字节,首先对象头存放的是对象运行时的数据,像是hashcode,锁标识,类型指针,那么对象体中存放的是对象的成员变量,成员变量包括从父类继承过的成员变量和本类的成员变量,那么如果父类和子类有重名的变量,那么这个时候就要看对象的静态类型是什么了,静态类型就是声明类型,如果声明类型是父类那么就直接选取父类的成员变量,如果声明类型是自己的类那么就选取本身类的成员变量,所以选取同名的成员变量的时候是根据静态类型来的。下面再看下成员方法的选取,方法其实是在方法区存放着一张虚表,虚表中存放着是方法的实际入口地址,在实际对象调用的时候虚表会做动态的改变,如果一个方法在子类中被重写了,而这时静态类型又是父类,那么就把虚表中被重写方法的实际入口地址,替换成被重写的方法的入口地址,所以在调用的时候是访问不到被重写的旧方法的。而静态方法直接就不能被重写,更别说调用被重写之后的方法,而且静态方法是属于类的,所以在调用的时候,直接调用的是本类的方法,与运行时对象是没关系的。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/156579.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 详解java人力外包的费用组成

    详解java人力外包的费用组成根据IDC的统计数字,在所有软件开发类人才的需求中,对java工程师的需求达到全部需求量的60%~70%,也就是说,很多企业的信息化建设都离不开java开发人员。但面对成本费用、灵活用工、编制限制、劳务纠纷等问题,包括BAT在内的很多大型知名企业都会与软件人力外包公司合作来引进java人才。那么什么是java人力外包?java人力外包指的是由用人企业向软件人力外包公司提出java方面的用人需求,包括人数、技能要求、到岗时间、项目周期、预算等,软件人力外包公司通过外派的方式将符合要求的java人才提供给

    2022年5月19日
    104
  • 如何解决缺少msvcr110.dll?[通俗易懂]

    如何解决缺少msvcr110.dll?[通俗易懂]版权声明:本文为博主原创文章,未经博主允许不得转载。https://blog.csdn.net/qq_42680327小编也是在自己电脑出现问题的情况下,写的这篇博文,希望能够帮到大家。如果大家有什么问题,可以给我留言……dll的安全问题还是要提醒下,建议到知名网站下载,或使用正规修复工具进行修复1当计算机中缺少msvcr110.dll文件时,运行某些程序会报错。如图所示:…

    2025年6月30日
    0
  • java跨境电商ERP源码「建议收藏」

    java跨境电商ERP源码「建议收藏」1订单管理本模块支持多平台订单自动下载同步以及多帐号多店铺订单管理,方便用户对销售进行科学、直观的分类管理。包括订单处理,包装验货,称重出库,智能交运,交运日志,快速拣货,快速发货等子模块。2商品管理(SKU)商品管理模块,提供对亚马逊店逊商品进行线下管理的功能,包括但不限于中文名称、英文名称,售价等相应管理3.采购管理采购管理主要对于商品采购、入库、及供应商的设置,并于商品细分,包括采购管理、入库管理和供应商管理模块。4.物流管理此模块主要提供用户设置速途未对接的物…

    2022年9月20日
    0
  • uml的什么模型图由活动图顺序图状态图和协作图组成_uml9种图

    uml的什么模型图由活动图顺序图状态图和协作图组成_uml9种图uml是程序员需要掌握一个重要工具,特别在研究hadoop(http://www.iigrowing.cn/hadoop)系统中,有很多相关的uml图形需要绘制,为了方便大家了解uml,在网络上找了些uml方面的文章(http://www.iigrowing.cn/?s=uml)在参考资料中,在uml参考资料中缺少活动图方面的介绍,因此特地在网络上寻找了一些资料,然后整理成一篇文章,供大家参考,水…

    2025年6月11日
    1
  • 数据库锁机制[通俗易懂]

    数据库锁机制[通俗易懂]1 前言数据库大并发操作要考虑死锁和锁的性能问题。看到网上大多语焉不详(尤其更新锁),所以这里做个简明解释,为下面描述方便,这里用T1代表一个数据库执行请求,T2代表另一个请求,也可以理解为T1为一个线程,T2为另一个线程。T3,T4以此类推。下面以SQLServer(2005)为例。2 锁的种类共享锁(Sharedlock)。例1:——–

    2022年6月29日
    30
  • 京东云服务器使用教程视频_京东通信app下载

    京东云服务器使用教程视频_京东通信app下载形势分析对公司而言,服务器并不是大事。互联网公司都有服务器和机房。但对个人开发者而言,服务器长久以来确是一大难题。但近年,国外亚马逊牵头开始做AWS云服务,并迅速获得极大成功。国内阿里巴巴及时跟进,推出阿里云平台。服务器对个人开发者而言不再是遥不可及,反而变得触手可及。甚至很多企业不再自己搭建服务器,转而使用云服务平台以节省成本。目前国内云服务平台已是百家争鸣,比起早年互联网环境已好很多。除阿里云外

    2022年10月14日
    0

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号