Java多态原理

Java多态原理Java 多态原理最近在准备面试 顺便复习以下 Java 最基础的东西仅作参考 Java 多态原理 Java 多态原理 0 什么是多态 1 jvm 内部类信息 2 多态的实现原理为了更好地理解多态的原理 首先必须对 jvm 内存模型 Java 方法调用等知识有点了解 0 什么是多态多态分为两种 本文着重讲解运行时多态 编译时多态 也叫做静态多态 指的是方法的重载 在同一个类中 同样的方法签名却有不同的参数 编译时通过静态绑定就能实现 运行时多态 也叫做动态多态 指的是方法的重写 在具有继承关系的类中 子类重

Java多态原理


为了更好地理解多态的原理,首先必须对jvm内存模型、Java方法调用等知识有点了解。

0. 什么是多态

多态分为两种,本文着重讲解运行时多态。

  1. 编译时多态。也叫做静态多态,指的是方法的重载,在同一个类中,同样的方法签名却有不同的参数。编译时通过静态绑定就能实现。
  2. 运行时多态。也叫做动态多态,指的是方法的重写,在具有继承关系的类中,子类重写了父类方法,方法签名和参数都一致,父类引用指向子类实例,该引用调用被重写方法时实际上调用的是子类的方法。需要运行时进行动态绑定实现。

1. jvm内部类信息

在下图可以看到jvm关于方法区中的类信息。

jvm通过类加载器,把类加载进方法区,在方法区维护了类的基本信息,其中就包括了方法信息,而为了能够快速访问具体方法,每个类都有一个方法表,里面存放了指向对应方法的指针。当需要调用某个类的方法时,只需要找到相应偏移量,就能够快速地找到对应的方法。

在这里插入图片描述

方法表的构成:

某个类的方法表包含了Object类、祖先类、父类、自身的方法指针。

在这里插入图片描述

2. 多态的实现原理

举个例子 A b = new B();,A B是具有继承关系的。示例代码如下:

public class A{ 
     //对比方法 public void method1(){ 
     ...; } //被子类重写的方法 public void method2(){ 
     ...; } } 
public class B extend A{ 
     //对比方法 public void method3(){ 
     ...; } //重写了父类的方法 @Override public void method1(){ 
     ...; } } 

在方法表里是如何的呢?

看下图:

在这里插入图片描述

可以看到,重写就是把子类方法的指针替换了方法表里父类对应方法项的值!

那么,具体的调用过程是怎样的呢?

A b = new B(); b.method2(); 

注意:此处笔者没有深入研究方法调用过程,仅作参考!欢迎同学们在评论区指正23333
首先,通过变量类型A,找到A的类信息,确定A的method方法的偏移量。

然后,通过对象引用,找到堆中B对象,通过B对象,找到B类信息,根据偏移量,调用B类方法表对应的方法!

最终实现了多态!

在这里插入图片描述

参考: Java多态的实现机制是什么,写得非常好!.






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

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

(0)
上一篇 2026年3月16日 下午7:02
下一篇 2026年3月16日 下午7:02


相关推荐

  • SQL索引使用初步,(转)

    SQL索引使用初步,(转)

    2021年6月20日
    103
  • 模块和包[通俗易懂]

    模块什么是模块:但其实import加载的模块分为四个通用类别:1使用python编写的代码(.py文件)2已被编译为共享库或DLL的C或C++扩展3包好一组模块的包4使用C编写并链

    2022年3月29日
    74
  • pandas astype()错误[通俗易懂]

    pandas astype()错误[通俗易懂]由于数据出现错误DataError:Nonumerictypestoaggregate改正以后才认识到astype的重要性。Top15[‘populations’]=Top15[‘EnergySupply’].div(Top15[‘EnergySupplyperCapita’]).astype(float)df_mean=((df.set_ind…

    2022年5月15日
    52
  • js垃圾处理机制_java中垃圾回收有什么目的

    js垃圾处理机制_java中垃圾回收有什么目的文章目录前置知识堆栈栈堆执行上下文与作用域链执行上下文作用域链一、JavaScript中怎么被定义为垃圾使用局部变量使用对象概括二、两种回收策略标记清理引用计数概括三、什么时候执行垃圾回收关于ChromeV8引擎的GC分代回收指针与活跃对象的区分回收的执行周期四、内存问题五、Es6WeakMap参考文章前置知识堆栈栈什么是栈栈其实是一种数据结构,有着先进后出,后进先出的特性,用生活中的事物来理解最形象的就是汉诺塔了。我们在栈中存储的数据就像汉诺塔的盘子一样,最先放进去在最下面,最后放入的盘.

    2022年10月9日
    4
  • js中判断数组中是否包含某元素的方法有哪些_js判断数组里面是否包含某个元素

    js中判断数组中是否包含某元素的方法有哪些_js判断数组里面是否包含某个元素方法一: arr.indexOf(某元素):未找到则返回-1。 实际用法:if(arr.indexOf(某元素)>-1){//则包含该元素}1例:varfruits=["Banana","Orange","Apple","Mango"];vara=fruits.indexOf("Apple");//2//以上输出结果意味着"Apple"元

    2022年10月19日
    10
  • c语言中uint32是啥意思_uint16数据类型

    c语言中uint32是啥意思_uint16数据类型C++的基础数据类型:C++的主要数据类型,主要分为三类:布尔型,整型(char型从本质上说,也是种整型类型,它是长度为1的整数,通常用来存放字符的ASCII码),浮点型。而*_t是typedef定义的表示标志,是结构的一种标注。即我们所看到的uint8_t、uint16_t、uint32_t都不是新的数据类型,而是通过typedef给类型起得别名。uint8_t/uint…

    2025年9月28日
    4

发表回复

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

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