我刚读完Java bytecode instruction listings并想知道:
Java字节码中ifne
和ifnonnull
之间的区别是什么?
我知道在高级语言(例如Java)中,值0
是一个具有一些操作(如加法,减法,乘法)的数值,可以与其他数值进行比较,而{{1} }}是一个代表"没有值"。
我想我遇到的一个问题是,我不知道如何在字节码/汇编中表示null
。
答案 0 :(得分:3)
JVM规范可能更清楚。
因此对于ifne
(and ifeq
etc),限制是:
ifeq
指令是类型安全的,如果一个人可以有效地弹出一个类型匹配int的传入操作数堆栈,产生传出类型状态NextStackFrame,并且指令的操作数Target是一个有效的分支目标,假设一个NextStackFrame的传入类型状态。
ifnonnull
限制是:
ifnonnull指令是类型安全的,如果一个人可以有效地弹出类型匹配引用关闭传入操作数堆栈,产生传出类型状态NextStackFrame,并且指令的操作数Target是一个有效的分支目标,假设传入类型状态为NextStackFrame。
基本上ifeq
和ifne
用于整数值,而ifnonnull
用于参考值。
要比较两个引用是否相等,请改用if_acmpeq
。 ifnonnull
实际上是一个特殊情况,只有一个操作数,因为它总是只与null进行比较。
就数据中null
引用的表示方式而言,JVM规范explicitly allows this to be implementation-specific:
参考值也可以是特殊的空引用,对无对象的引用,这里将用null表示。 null引用最初没有运行时类型,但可以转换为任何类型。引用类型的默认值为null。
Java虚拟机规范没有规定编码null的具体值。