【发布时间】:2016-04-03 06:39:57
【问题描述】:
就像said 中的JVMS8:
虽然Java虚拟机定义了布尔类型,但它只提供 对它的支持非常有限。没有单独的 Java 虚拟机指令 专用于对布尔值的操作。相反,Java 中的表达式 对布尔值进行操作的编程语言被编译为使用值 Java 虚拟机 int 数据类型。
确实,这两种方法:
boolean expr1(boolean a, boolean b) {
return a || b;
}
int expr2(int a, int b) {
return ((a != 0) || (b != 0)) ? 1 : 0;
}
将产生相同的字节码(方法签名除外)
boolean expr1(boolean, boolean);
Signature: (ZZ)Z
Code:
0: iload_1
1: ifne 8
4: iload_2
5: ifeq 12
8: iconst_1
9: goto 13
12: iconst_0
13: ireturn
int expr2(int, int);
Signature: (II)I
Code:
0: iload_1
1: ifne 8
4: iload_2
5: ifeq 12
8: iconst_1
9: goto 13
12: iconst_0
13: ireturn
所以,我不明白为什么JVM 仍然需要boolean 类型?只是为了方法签名的运行时检查?
【问题讨论】:
-
您可以使用
boolean类型编写比模拟boolean的int更简洁的代码。 -
@MickMnemonic 当然。但我说的不是
java语言本身,而是JVM,它对java语言一无所知。 -
@sidgate 问题不在于使用
0/1。问题是,为什么JVM需要声明特殊类型的boolean,而不仅仅是int,而它没有针对int的特殊说明。所以不要问java规范,而是问JVM架构。 -
这可能是特定于实现的。即使 Oracle JVM 将
booleans 实现为ints,也并非所有 JVM 实现都必须这样做。int和boolean在语义上是不同的,因此对于 JVM 实现来说,了解差异并使用此信息可能很有用,例如进行优化。 -
@MickMnemonic 我不能同意你的看法。这不是关于特定的
OracleJVM 实现,而是关于JVM规范:JVM 中没有特殊的布尔指令,所以不能是Oracle特定的