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)
上一篇 2022年7月7日 下午9:36
下一篇 2022年7月7日 下午9:46


相关推荐

  • docker入门实战笔记[通俗易懂]

    docker入门实战笔记

    2022年2月9日
    39
  • 风格迁移简介

    风格迁移简介1 神经风格迁移之前的风格迁移方法 1 基于笔划的渲染 Stroke basedrenderi 基于笔划的渲染是指在数字画布上增加虚拟笔划以渲染具有特定样式的图片的方法 应用场景大多限定在油画 水彩 草图等 不够灵活 2 图像类比方法图像类比旨在学习一对源图像和目标图像之间的映射 以监督学习的方式定位风格化图像 图像类比训练集包括成对的未校正的源图像和具有特定样式的

    2026年3月19日
    2
  • 固态硬盘数据恢复商家梳理[通俗易懂]

    固态硬盘数据恢复商家梳理[通俗易懂]整理了几家固态硬盘数据恢复商家联系方式,分享给大家。淘宝店名 地址 联系人 电话 价格 成功率 备注 ccbccr服务旗舰店 北京市海淀区中关村中科大厦A座14层1408 辛师傅 13269874833 2000-5000 50% 不许一直在现场看 云光科技数据恢复中心 河北张家口市涿鹿合符大街合符北区8-3-401 陈晓光 13522121334 400 80% 可以到现场观看修复过程

    2026年2月2日
    5
  • spin_lock & mutex_lock的差别?

    spin_lock & mutex_lock的差别?

    2021年12月7日
    49
  • 2021navicat激活码(注册激活)

    (2021navicat激活码)2021最新分享一个能用的的激活码出来,希望能帮到需要激活的朋友。目前这个是能用的,但是用的人多了之后也会失效,会不定时更新的,大家持续关注此网站~IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.html…

    2022年3月28日
    710
  • CANopen通信之NMT通信

    CANopen通信之NMT通信在介绍 NMT 通信机制之前 先介绍一下 NMT 这个通信对象的定义 在以下部分中 COB ID 使用的是 nbsp CANopen nbsp 预定义连接集中已定义的缺省标志符 1 nbsp NMT nbsp 模块控制 nbsp NMT nbsp Module nbsp Control nbsp nbsp nbsp nbsp 只有 nbsp NMT Master nbsp 节点能够传送 nbsp NMT nbsp Module nbsp Control nbsp 报文 nbsp 所有从设备必须支持 nbsp NMT nbsp 模块控制服务 NMT nbsp Module nbsp Control nbsp

    2026年3月17日
    2

发表回复

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

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