栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

深入理解Java虚拟机——方法调用(动态分派调用)

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

深入理解Java虚拟机——方法调用(动态分派调用)

目录

一、动态分派调用

1.1、方法动态分派调用演示1.2、方法动态分派调用的原因

一、动态分派调用 1.1、方法动态分派调用演示

示例代码

public class Test4 {

    static class Parent{
        public void hello(){
            System.out.println("hello parent");
        }
    }

    static class Child1 extends Parent{
        @Override
        public void hello() {
            System.out.println("hello Child1");
        }
    }

    static class Child2 extends Parent{
        @Override
        public void hello() {
            System.out.println("hello Child2");
        }
    }

    public static void main(String[] args) {
        Parent p1 = new Child1();
        Parent p2 = new Child2();
        p1.hello();
        p2.hello();
    }
}

输出结果

总结
显然这里不可能再根据静态类型来决定,因为静态类型同样都是Parent的两个变量p1和p2在调用hello()方法时执行了不同的行为,并且变量p1在两次调用中执行了不同的方法。

1.2、方法动态分派调用的原因

使用javap命令输出这段代码的字节码,尝试从中寻找答案。

原因就需要从invokevirtual指令的多态查找过程开始说起,invokevirtual指令的运行时解析过程大致分为以下几个步骤:
(1)、找到操作数栈顶的第一个元素所指向的对象的实际类型,记作C。
(2)、如果在类型C中找到与常量中的描述符合简单名称都相符的方法,则进行访问权限校验,如果通过则返回这个方法的直接引用,查找过程结束;如果不通过,则返回java.lang.IllegalAccessError异常。
(3)、否则,按照继承关系从下往上一次对C的各个父类进行第(2)步的搜索和验证过程。
(4)、如果始终没有找到合适的方法,则抛出java.lang.AbstractMethodError异常。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/785484.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号