在Java中,二进制操作符何时执行?



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

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

我编译了这个类:

javac Test.java

然后我尝试像这样在。class上添加javap:

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。

参见Java语言规范,其中说:

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

关于常量表达式

的构成,请参阅另一章。

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

  • 基本类型的字面值和字符串类型的字面值[…]
  • 加性运算符+和-[…]

最新更新