Java多态原理

本文探讨了Java的多态性,主要聚焦于运行时多态,即方法的重写。通过实例展示了如何在类的继承结构中,父类引用调用子类方法实现动态绑定。在JVM中,类的信息存储在方法区,每个类有一个方法表,用于快速访问方法。多态的实现原理涉及查找对象在堆中的类信息,并根据偏移量调用相应方法。这种方法表的更新使得父类引用能够调用到子类的重写方法,从而实现多态性。
摘要由CSDN通过智能技术生成

Java多态原理

最近在准备面试,顺便复习以下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多态的实现机制是什么,写得非常好!.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值