【问题标题】:What is the purpose of `boolean` type in JVM?JVM中“布尔”类型的目的是什么?
【发布时间】: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 类型编写比模拟booleanint 更简洁的代码。
  • @MickMnemonic 当然。但我说的不是java 语言本身,而是JVM,它对java 语言一无所知。
  • @sidgate 问题不在于使用0/1。问题是,为什么JVM 需要声明特殊类型的boolean,而不仅仅是int,而它没有针对int 的特殊说明。所以不要问java 规范,而是问JVM 架构。
  • 这可能是特定于实现的。即使 Oracle JVM 将 booleans 实现为 ints,也并非所有 JVM 实现都必须这样做。 intboolean 在语义上是不同的,因此对于 JVM 实现来说,了解差异并使用此信息可能很有用,例如进行优化。
  • @MickMnemonic 我不能同意你的看法。这不是关于特定的Oracle JVM 实现,而是关于JVM 规范:JVM 中没有特殊的布尔指令,所以不能是Oracle 特定的

标签: java jvm boolean


【解决方案1】:

维护方法重载至少需要它。假设我们在同一个类中有两个方法

boolean a(boolean x) {...}

boolean a(int x) {...}

它们可以有不同的内部逻辑,所以在字节码中应该通过它们的签名来区分。

【讨论】:

  • 返回类型也是 JVM 签名的一部分。
猜你喜欢
  • 2010-09-13
  • 1970-01-01
  • 2023-04-11
  • 1970-01-01
  • 1970-01-01
  • 2019-04-02
  • 1970-01-01
  • 1970-01-01
  • 2011-05-30
相关资源
最近更新 更多