java静态分配和动态分配

本文探讨了Java中的静态分配(方法重载)和动态分配(方法重写)。静态分配在编译阶段通过参数的静态类型决定方法版本,而动态分配在运行时基于对象的实际类型确定执行版本,体现了多态性。通过字节码分析解释了Java虚拟机如何实现动态分派。
摘要由CSDN通过智能技术生成

1.方法调用


先来说说java方法的调用,方法的调用不等于方法执行,方法调用阶段唯一的任务是确定被调用方法的版本(即调用哪个方法,不是唯一的,确定一个“更加合适”的版本),不涉及方法内部的具体运行过程。
我们都是知道java文件都需要编译成class文件,而一切方法调用在class文件里存储的都是符号引用,而不是方法的实际运行时内存布局的入口地址(相当于直接引用)。在类加载的解析阶段,会将其中的一部分符号引用转化为直接引用,这种解析成立的前提是:方法的程序真正运行之前就有一个可确认的调用版本,并且这个方法的调用版本在运行期是不可变的。换句话说,调用目标在程序代码写好、编辑器进行编译时就必须确认下来,这类方法调用的调用称为解析。
在Java虚拟机里提供了5条调用方法字节码指令,分别如下。
    invokestatic:调用静态方法
    invokespeciak: 调用实例构造器<init>方法、私用方法和父类方法
    invokevirtual: 调用所有的虚方法
    invokeinterface:调用接口时,会在运行再确定一个实现接口的对象
    invokedynamic:现在运行时动态解析出调用点限定符引用的方法,再执行方法
只有被invokestatic和invokespecial指令调用的方法,可以在解析阶段中确定调用的版本,符合这个条件的静态方法、私有方法、实例构造器、父类方法。它们在类加载的解析时候就会把符号引用解析为直接引用。这些方法被称为非虚方法。解析调用一定是一个静态的过程,在编译期间就完全确定,而分配调用可能是静态的也可能是动态的

2.分派


Java是一门面向对象的编程语言,因为Java具备面向对象的3个基本特征:封装、继承、多态。来看看虚拟机如何通过分派确定“重写”和”重载“方法的目标方法。

来看一个静态分配的例子

  • 6
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值