Java 中的二元运算符什么时候执行?

2023-11-21

我正在尝试理解java字节码。我从简单的例子开始:

public class Test
{
    public static void main(String args[])
    {
        System.out.println(2 + 1);
    }
}

我编译了这个类:

javac Test.java

然后我尝试了javap在 .class 上这样:

javap -c Test

这给了我这个:

Compiled from "Test.java"
public class Test {
  public Test();
    Code:
       0: aload_0       
       1: invokespecial #1                  // Method java/lang/Object."<init>":()V
       4: return        

  public static void main(java.lang.String[]);
    Code:
       0: getstatic     #2                  // Field java/lang/System.out:Ljava/io/PrintStream;
       3: iconst_1      
       4: invokevirtual #3                  // Method java/io/PrintStream.println:(I)V
       7: return        
}

除了这一行之外,我还能理解它:

public static void main(java.lang.String[]);
. . . 
3: iconst_1    
. . .

看看我的源代码和这个字节代码,看起来 javac 已经完成了这个语句的加法操作:

2+1

并要求 jvm 返回该常量。

如果我的理解有误,有人可以纠正我吗? javac 是否执行编译操作+,-,*在它实际在jvm上运行之前等等?如果是这样怎么办?


2 + 1 是编译时常量表达式。编译器本身在字节码中将其替换为 3。

See the Java语言规范,其中说:

某些表达式的值可以在编译时确定。这些是常量表达式。

See 这另一章常量表达式的构成是什么

常量表达式是表示基本类型值或不会突然完成的字符串的表达式,并且仅使用以下内容组成:

  • 原始类型的文字和 String 类型的文字 [...]
  • 加法运算符 + 和 - [...]
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java 中的二元运算符什么时候执行? 的相关文章

随机推荐

  • 为什么我们在java中需要用户定义的类加载器

    为什么tomcat有自己的类加载器 用户定义的类加载器有什么好处 它隔离部署到容器中的各种Web应用程序 也就是说 Web 应用程序的行为不会受到部署 取消 部署另一个 Web 应用程序的影响 每个 Web 应用程序只能看到自己的类 而看不
  • 当窗口恢复时,C# 中是否会引发事件?

    在 C NET 中恢复窗口时是否会引发任何事件 我注意到激活窗口时会引发一个事件 但我找不到正在恢复的窗口的相应事件 例如从最大化或最小化状态 如果您不喜欢使用表格WindowState属性并且不想保留指示表单先前状态的标志 您可以在稍低的
  • 如何获取调用错误的位置?

    我正在寻找替代品loch 及其预处理器 因为它不能使用 ghc 7 进行编译 具体来说 如果error被调用然后我想尽可能方便地弄清楚它是从哪里调用的 行号和堆栈跟踪会很好 您可以使用 xcRTS 选项 如所述这一页 您需要使用分析支持来编
  • 创建带有自定义 URL、标题和图像的 Facebook 分享按钮

    Facebook 曾经允许在 Facebook 分享按钮中自定义参数 但现在不起作用 我需要的是创建一个 Facebook 分享按钮 该按钮将具有自定义标题 网址 图像 描述等 它无法使用元标记来完成 因为单个页面上有多个分享按钮 每个应该
  • 为什么我的 Eclipse 控制台中有多个 Angular 语言服务器选项卡

    这些天我经常打开 PyDev 透视图并在 Eclipse 中进行 Python 编程 当我从 IDE 运行 Python 程序并检查控制台的输出时 我发现我不仅有 Python 运行的输出 而且我现在还计数了 4 个 Angular 语言服
  • 如何在项目上下文之外包含 Maven 模块?

    我希望在某种全局项目目录中有一个模块 以便我可以将该模块包含在使用该通用代码的所有其他项目中 但我怎样才能告诉内行父母pom包含并编译这个全局共享模块 以下不起作用 svn MyGlobalProject project commons p
  • ko.toJSON() 可以处理日期吗?

    我在 ASP NET MVC 页面上使用 KnockoutJS 我正在使用 ajax 通过调用将表单保留回服务器ko toJSON viewModel 然后使用 jQuery 将结果发送回服务器 视图模型上的所有属性均已成功序列化 但 Ja
  • 导入 com.google.android.gms.* 时出错;

    我正在尝试实施该解决方案link 需要导入这些 import com google android gms common ConnectionResult import com google android gms common Googl
  • 在 github actions yml 文件中创建 Minio(S3) 容器

    我正在尝试创建一个 Minio S3 容器 以便我可以在 github 上运行我的测试套件作为操作 我目前有以下内容 name Run Tests on push branches master pull request branches
  • 如何更改 Apache Tomcat Web 服务器端口号 [关闭]

    Closed 这个问题不符合堆栈溢出指南 目前不接受答案 如何更改 Apache Tomcat Web 服务器默认端口号 我正在 JSP 中开发一个 Web 应用程序 出于某种目的 我需要更改 tomcat 访问端口 有没有可能 简单 您可
  • 如何在 LibreOffice 中安装或激活 PyUno?

    如何让 Python 任何 Python 了解 LibreOffice 中的 PyUno 当我做 import uno python says that it knows no module uno This question came u
  • 使用远程图像创建 CycleTile

    我见过许多展示 CycleTile 实际应用的示例 但这些示例都使用了本地图像 是否可以在应用程序首次运行后设置这些图像并将 CycleTile 指向远程图像 或者 如果我确实需要先将这些保存到手机中 如何让 CycleTile 引用它们
  • Linux 上哪些 C++ IDE 的“智能感知”能力与 Visual Studio 相当或更好? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 管道中有一些基于 Linux 的 C 项目 我应该选择哪种 IDE 来提供某种与纯 Visual Studio 即没有 Visual Assist
  • 在java中使用response.sendRedirect方法发送Post请求

    我想用java发送一个post请求 我已经看到使用 Http 客户端发送请求的示例 但我想使用 sendRedirect 方法 对于前 我想使用 post 请求发送这些参数 因此 这些参数对任何人都不可见 同时我需要将我的网址重定向到该网址
  • 如何在Tensorflow 2.0中通过Xavier规则进行权重初始化?

    TF 2 0恰巧干掉了contrib图书馆 因此 所有的好东西都喜欢tf contrib conv2d or tf contrib layers variance scaling initializer消失了 也就是说 您认为在 TF2 0
  • MEF 和单独的接口组装导致“每个类的接口”

    我特别熟悉 DI IoC 和 MEF 我有一个 Web 应用程序 它有两种类型的部分 也许有一天会更多 这些部分由需要访问整个环境的接口定义 该应用程序有一个由 MEF 组成的列表 其中包含每种类型的具体实现 环境包括 几个存储库 当前的申
  • 在不使用 QUOTENAME 的情况下正确转义 SQL Server 中的分隔标识符

    除了将标识符 表 视图 列 用双引号括起来以及标识符名称中存在的 双引号 之外 代码还必须执行其他操作吗 参考文献将不胜感激 我继承了一个具有自定义对象关系映射 ORM 系统的代码库 SQL 无法在应用程序中编写 但 ORM 最终仍必须生成
  • 使用 Django 选择上传文件的文件名

    我正在上传图像 由 FileField 表示 并且需要在上传这些文件时重命名它们 我希望它们的格式如下 d d s s width height md5hash original extension 我已阅读文档 但我不知道是否需要编写自己
  • 限制可写入路径的记录数量(参考安全规则中的其他路径)

    假设我的 Firebase 系列如下所示 max 5 things 我将如何使用的价值max在我的安全规则中限制数量things rules things validate newData val length lt max 使用现有属性是
  • Java 中的二元运算符什么时候执行?

    我正在尝试理解java字节码 我从简单的例子开始 public class Test public static void main String args System out println 2 1 我编译了这个类 javac Test