iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >如何理解Java常见知识点中的分派机制
  • 565
分享到

如何理解Java常见知识点中的分派机制

2023-06-05 04:06:35 565人浏览 独家记忆
摘要

如何理解Java常见知识点中的分派机制,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。在Java中,符合“编译时可知,运行时不可变”这个要求的方法主要是静态方法和私有方法。这

如何理解Java常见知识点中的分派机制,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。

在Java中,符合“编译时可知,运行时不可变”这个要求的方法主要是静态方法和私有方法。这两种方法都不能通过继承或别的方法重写,因此它们适合在类加载时进行解析。

Java虚拟机中有四种方法调用指令

  • invokestatic:调用静态方法。

  • invokespecial:调用实例构造器方法,私有方法和super。

  • invokeinterface:调用接口方法。

  • invokevirtual:调用以上指令不能调用的方法(虚方法)。

只要能被invokestatic和invokespecial指令调用的方法,都可以在解析阶段确定唯一的调用版本,符合这个条件的有:静态方法、私有方法、实例构造器、父类方法,他们在类加载的时候就会把符号引用解析为该方法的直接引用。这些方法被称为非虚方法,反之其他方法称为虚方法(final方法除外)。

虽然final方法是使用invokevirtual 指令来调用的,但是由于它无法被覆盖,多态的选择是唯一的,所以是一种非虚方法。

一. 静态分派

对于类字段的访问也是采用静态分派

People man = new Man()

静态分派主要针对重载,方法调用时如何选择。在上面的代码中,People被称为变量的引用类型,Man被称为变量的实际类型。静态类型是在编译时可知的,而动态类型是在运行时可知的,编译器不能知道一个变量的实际类型是什么。

编译器在重载时候通过参数的静态类型而不是实际类型作为判断依据。并且静态类型在编译时是可知的,所以编译器根据重载的参数的静态类型进行方法选择。

在某些情况下有多个重载,那编译器如何选择呢? 编译器会选择”最合适”的函数版本,那么怎么判断”最合适“呢?越接近传入参数的类型,越容易被调用。

二. 动态分派

动态分派主要针对重写,使用invokevirtual指令调用。invokevirtual指令多态查找过程:

  • 找到操作数栈顶的第一个元素所指向的对象的实际类型,记为C。

  • 如果在类型C中找到与常量中的描述符合简单名称都相符的方法,则进行访问权限校验,如果通过则返回这个方法的直接引用,查找过程结束;如果权限校验不通过,返回java.lang.IllegalAccessError异常。

  • 否则,按照继承关系从下往上一次对C的各个父类进行第2步的搜索和验证过程。

  • 如果始终没有找到合适的方法,则抛出 java.lang.AbstractMethodError异常。

三. 虚拟机动态分派的实现

由于动态分派是非常繁琐的动作,而且动态分派的方法版本选择需要考虑运行时在类的方法元数据中搜索合适的目标方法,因此在虚拟机的实现中基于性能的考虑,在方法区中建立一个虚方法表(invokeinterface 有接口方法表),来提高性能。

虚方法表中存放各个方法的实际入口地址。如果某个方法在子类没有重写,那么子类的虚方法表里的入口和父类入口一致,如果子类重写了这个方法,那么子类方法表中的地址会被替换为子类实现版本的入口地址。

关于如何理解Java常见知识点中的分派机制问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注编程网精选频道了解更多相关知识。

--结束END--

本文标题: 如何理解Java常见知识点中的分派机制

本文链接: https://www.lsjlt.com/news/241128.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 如何理解Java常见知识点中的分派机制
    如何理解Java常见知识点中的分派机制,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。在Java中,符合“编译时可知,运行时不可变”这个要求的方法主要是静态方法和私有方法。这...
    99+
    2023-06-05
  • 如何理解Java常见知识点中的class loader
    本篇文章给大家分享的是有关如何理解Java常见知识点中的class loader,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。一. 什么是classLoader当我们写好一个J...
    99+
    2023-06-05
  • 怎么理解Java常见知识点中的垃圾回收机制
    这篇文章将为大家详细讲解有关怎么理解Java常见知识点中的垃圾回收机制,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。Java堆中存放着大量的Java对象实例,在垃圾收集器回收内存前,第一件事...
    99+
    2023-06-05
  • 如何理解Java常见知识点中的Jvm架构
    如何理解Java常见知识点中的Jvm架构,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种...
    99+
    2023-06-05
  • 如何理解Java常见知识点中的线程池
    这期内容当中小编将会给大家带来有关如何理解Java常见知识点中的线程池,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。线程池的基本思想是一种对象池,在程序启动时就开辟一块内存空间,里面存放了众多(未死亡)的...
    99+
    2023-06-05
  • 如何理解Java知识点中的常见设计模式
    这期内容当中小编将会给大家带来有关如何理解Java知识点中的常见设计模式,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。一. 观察者模式观察者模式用一句话描述就是当一个类的对象(被观察者)的状态发生改变时同...
    99+
    2023-06-05
  • Java中锁的常见知识点有哪些
    本篇文章给大家分享的是有关Java中锁的常见知识点有哪些,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。锁的概念可重入锁如果锁具备可重入性,则称作为可重入锁。像synchroni...
    99+
    2023-06-05
  • 如何理解java 知识点的集合分析
    今天就跟大家聊聊有关如何理解java 知识点的集合分析,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。1 、对象的初始化  (1 )非静态对象的初始化  在创建对象时,对象所在类的所有...
    99+
    2023-06-02
  • Java常见知识点中的泛型指的是什么
    本篇文章为大家展示了Java常见知识点中的泛型指的是什么,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。开发人员在使用泛型的时候,很容易根据自己的直觉而犯一些错误。比如一个方法如果接收List作为形式...
    99+
    2023-06-05
  • Java常见知识点中==和equals的区别是什么
    这篇文章将为大家详细讲解有关Java常见知识点中==和equals的区别是什么,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。== 是一个运算符。 equals则是string对象的方法。ja...
    99+
    2023-06-05
  • Java中的异常和处理知识点总结
    这篇文章主要介绍“Java中的异常和处理知识点总结”,在日常操作中,相信很多人在Java中的异常和处理知识点总结问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java中的异常和处理知识点总结”的疑惑有所帮助!...
    99+
    2023-06-17
  • 非常详细的Java异常处理机制知识整理大全
    目录异常的基本概念:Error与Exception:运行时的异常和非运行时的异常常见的运行时异常:常见的非运行异常:Java异常处理:try/catch/finally执行情况:tr...
    99+
    2022-11-13
    简述java异常处理机制 java中异常处理机制的原理和应用 java异常处理机制包括哪些
  • Spring的事件机制知识点详解及实例分析
    同步事件和异步事件 同步事件: 在一个线程里,按顺序执行业务,做完一件事再去做下一件事。 异步事件: 在一个线程里,做一个事的同事,可以另起一个新的线程...
    99+
    2024-04-02
  • Java虚拟机中的双亲委派机制怎么理解
    Java虚拟机中的双亲委派机制怎么理解,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。Java虚拟机对class文件采用的是按需加载的方式,也就是说当需要使用该类...
    99+
    2023-06-22
  • 如何理解CSS中Font的一些基本知识点
    本篇内容主要讲解“如何理解CSS中Font的一些基本知识点”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何理解CSS中Font的一些基本知识点”吧!1、什么是...
    99+
    2024-04-02
  • 如何理解Java中的SPI机制
    本篇内容介绍了“如何理解Java中的SPI机制”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!SPI的概念SPI在Java中的全称为Servi...
    99+
    2023-06-15
  • Java中异常处理机制的示例分析
    这篇文章给大家分享的是有关Java中异常处理机制的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。  你觉得自己是一个Java专家吗?是否肯定自己已经全面掌握了Java的异常处理机制?在下面这段代码中,你能...
    99+
    2023-06-03
  • PHP 自动加载中的知识点解析:避免常见错误,轻松掌握
    1. PHP自动加载概述 PHP自动加载是指PHP在实例化一个类时,如果该类没有被加载,PHP就会自动搜索并加载该类。自动加载的主要目的是为了简化类加载的过程,避免开发者在每次使用一个类时都需要手动加载。 2. 自动加载的基本原理 PH...
    99+
    2024-02-12
    PHP 自动加载 实例化 命名空间
  • Java常见知识点中Jvm内存结构、Java内存模型、Java对象模型的区别是什么
    这篇文章将为大家详细讲解有关Java常见知识点中Jvm内存结构、Java内存模型、Java对象模型的区别是什么,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。我们都知道,Java代码是要运行在...
    99+
    2023-06-05
  • Java中try-catch-finally异常处理机制的示例分析
    小编给大家分享一下Java中try-catch-finally异常处理机制的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!一、异常处理异常(Excepti...
    99+
    2023-06-20
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作