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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • unity3d吧_unity3d从入门到精通

    unity3d吧_unity3d从入门到精通2-62-72-82-92-103-33-43-5

    2022年9月2日
    2
  • 监督学习和无监督学习区别

    监督学习和无监督学习区别前言机器学习分为:监督学习,无监督学习,半监督学习(也可以用hinton所说的强化学习)等。在这里,主要理解一下监督学习和无监督学习。监督学习(supervisedlearning)从给定的训练数据集中学习出一个函数(模型参数),当新的数据到来时,可以根据这个函数预测…

    2022年5月8日
    64
  • sql server下载安装步骤(sql2005安装教程图解)

    sql server下载安装步骤(sql2005安装教程图解)SQLServer2017下载安装教程第一步:打开浏览器,在浏览的搜索框中我们输入“SQLServer”。如图,会匹配出中文两条微软官方下载页面(一个页面内容是英文、一个页面内容是中文)。这里我们以中文的为例。第二步:点击进入下载页面后,可以看到如图所示页面,我们不要着急点击下载,因为这些SQLServer只能试用180天(大家从介绍中可以看到)。第三步:我们将网页下滑,可以看到…

    2022年4月18日
    418
  • AbstractQueuedSynchronizer浅析「建议收藏」

    AbstractQueuedSynchronizer浅析「建议收藏」文章目录简介如何实现自定义同步器实现分析1.publicfinalvoidacquire(intarg)该方法以排他的方式获取锁,对中断不敏感,完成synchronized语义。简介这是一个抽象类,提供了一个FIFO(先进先出的队列),可以用来构建锁或者其他同步装置的基础框架。该同步器利用intstate来表示一个状态。子类通过继续该抽象类并实现他的方法来管理其状态,管理方式是通过acquire(intarg)方法release(intarg)方法来操作状态。多线程环境中对状

    2022年9月25日
    2
  • 闫学灿acwing_acwing算法基础

    闫学灿acwing_acwing算法基础1 2 3 4 5 6 7 ############################# 1 # | # | # | | # #####—#####—#—#####—# 2 # # | # # # # # #—#####—#####—#####—# 3 # | | # # # # # #—#########—#####–…

    2022年8月8日
    6
  • tensorflow矩阵运算_二维矩阵求逆

    tensorflow矩阵运算_二维矩阵求逆线性回归算法能表示为矩阵计算,Ax=b。这里要解决的是用矩阵x来求解系数。1.导入必要的编程库,初始化计算图,并生成数据。>>>importmatplotlib.pyplotasplt>>>importnumpyasnp>>>importtensorflowastf>>>sess=tf.Session…

    2022年8月21日
    8

发表回复

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

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