Java编译器的行为------第一节:方法
来源:互联网 发布:软件测试原佩腾 编辑:程序博客网 时间:2024/03/29 22:32
可以将Java虚拟机看做一个组件,他的存在实现了Java程序“一次编译,到处执行”的目标。Oracle的JDK软件包含两部分内容:一部分是将Java源代码编译成字节码文件(Java虚拟机指令集文件)的编译器,一部分是用于实现Java虚拟机运行时环境(JRE)。编译器和虚拟机两者相辅相成,下面是Java编译器的行为:
1、接收参数
如果传递n个参数给某个实例方法,则当前栈帧会按照约定的顺序接收这些参数,并将它们保存在方法的第1个到第n个局部变量之中,而他的第0个局部变量用于存放自身实例的引用(Java语言中访问自身实例的关键字this就是通过第0个局部变量实现的)。
如果传递n个参数给一个类方法(static),则当前栈帧也会按照约定的顺序接收这些参数,但将它们保存在方法的第0个到第n-1个局部变量之中(因为类方法不依赖于实例,不存在自身实例引用这一概念)。
2、方法调用
普通实例方法调用是在运行时根据对象类型进行分派的(相当于动态绑定),这类方法的调用是通过虚拟机指令集中的invokevirtual指令完成,该指令带有一个表示索引的参数,该参数表示此方法的符号引用在运行时常量池中的索引位置,通过符号引用就可以获得方法所在对象类型的名称、方法名称和方法描述符。
注:编译器并不需要获得类实例的内部布局,他只需产生方法的符号引用并存储到常量池中即可。而运行时常量池项会在执行时转换成调用方法的实际地址。
类方法(static)调用过程和普通实例调用方法类似,区别在两个方面:类方法调用是通过虚拟机指令集中的invokestatic指令完成;类方法调用时无需传递this参数。
实例初始化方法是有编译器调用的,其调用是通过虚拟机指令集中的invokespecial指令完成。同时,父类的实例方法和实例的私有方法调用也是通过invokespecial指令完成。
注:使用invokespecial指令的方法都是实例方法,故其第0个局部变量都为this。
注:编译器在生成invokevirtual指令时,也会生成这个指令所引用的描述符,这个描述符包含方法实际参数和返回类型。编译器在方法调用时不会处理参数的类型转换问题,只是简单的将参数压人操作数栈,且不改变其类型。而对于描述符的解析要等到运行时才会进行。
- Java编译器的行为------第一节:方法
- 诡异的编译器行为
- 了解编译器的行为
- java的调用方法行为
- 快乐的sublime 编译器 第一节(命令面板)
- 我的第一节Java课
- 对java的见识第一节
- java编译器异常查看的方法
- assert 断言的不同编译器行为
- java第一节
- java第一节
- java学习 第一节 java的历史
- JAVA构造器内部的多态方法的行为
- Java构造器内部的多态方法的行为
- java 构造器内部的多态方法和行为
- Java编程: 类的反射(第一节)
- 《Java并发》:第一节 并发的意义
- 第一节,java网络编程学习的概念
- java运算符记录
- 如何从Eclipse 迁移到Android Studio 且保持Eclipse项目结构
- React常用插件介绍:React中我们为什么要用 redux-thunk,它能做什么?
- 矩阵的最小路径和 [DP]
- Android高效率编码-细节,控件,架包,功能,工具,开源汇总
- Java编译器的行为------第一节:方法
- Activity和Fragment的数据传递
- U1077:error C:\Windows\System32\cscript.exe return code 1 wince7编译很变态的问题
- mybatis 最简单的执行自定义SQL语句
- 如何使用Git上传项目代码到github
- 从零开始学网络爬虫之数据区MySQL
- Log4j2配置之Appenders
- 获取当前cell
- 最大正数pascal程序