我知道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))))
答案 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
这显示以下执行顺序:
Precedence
对象。My String
常量分配给Precedence.s
。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