Java运算符优先级示例

时间:2015-06-24 03:24:43

标签: java operator-precedence

我知道Operator Precedence list,但我无法弄清楚“LINE 1”中此代码中的执行优先级。之前创建了什么对象?例如:new Precedence()还是public class Precedence { public String s; public static void main (String ... args){ String a = new Precedence().s="My String"; // LINE 1 System.out.println(a); } } ?我们如何在此示例中应用运算符优先级规则?

My String

输出: (append ((flatten(first lst)) flatten(rest lst))))

3 个答案:

答案 0 :(得分:3)

String a = new Precedence().s="My String"; // LINE 1

是带有初始化表达式的local variable declaration statement

  

每次执行时,都会按顺序处理声明符   左到右。如果声明者有初始化器,则初始化器为   评估并将其值分配给变量。

a是声明者。它被评估为产生一个变量(本身)。然后评估初始化表达式。

new Precedence().s = "My String";

an assignment expression。首先计算运算符的左侧以生成变量,因此首先计算new Precedence(),实例化类Precedence,生成对象的引用。然后评估作业的右侧,String文字"My String",以便生成对String对象的引用。然后,赋值将String对象的引用分配给由新实例创建表达式返回的值引用的对象的变量s

最后,自

  

在运行时,赋值表达式的结果是值   分配发生后的变量。

分配给s对象的字段Precedence的值也会分配给变量a

答案 1 :(得分:1)

这里是字节码:

public static transient varargs main([Ljava/lang/String;)V
   L0
    LINENUMBER 8 L0
    NEW Precedence
    DUP
    INVOKESPECIAL Precedence.<init> ()V
    LDC "My String"
    DUP_X1
    PUTFIELD Precedence.s : Ljava/lang/String;
    ASTORE 1

这显示以下执行顺序:

  1. 创建Precedence对象。
  2. My String常量分配给Precedence.s
  3. 也将其分配给a

答案 2 :(得分:1)

有工具javap,dissasembler,它会显示字节码,从那里你可以得出什么是执行顺序。它将输出注释。

$ /usr/lib/jvm/java-7-oracle/bin/javap -c Precedence.class 
Compiled from "Precedence.java"
public class Precedence {
  public java.lang.String s;

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

  public static void main(java.lang.String...);
    Code:
       0: new           #2                  // class Precedence
       3: dup           
       4: invokespecial #3                  // Method "<init>":()V
       7: ldc           #4                  // String My String
       9: dup_x1        
      10: putfield      #5                  // Field s:Ljava/lang/String;
      13: astore_1      
      14: getstatic     #6                  // Field java/lang/System.out:Ljava/io/PrintStream;
      17: aload_1       
      18: invokevirtual #7                  // Method java/io/PrintStream.println:(Ljava/lang/String;)V
      21: return        
}

javap是JDK的一部分,路径在Linux上,switch -c是反汇编代码。这里是指令ldc的定义,它的作用并不明显

push a constant #index from a constant pool (String, int or float) onto the stack