[英]Java Operator Precedence example
我知道運算符優先級列表 ,但我無法弄清楚“LINE 1”中此代碼中的執行優先級。 之前創建了什么對象? 例如: My String
或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
這個
String a = new Precedence().s="My String"; // LINE 1
是帶有初始化表達式的局部變量聲明語句 。
每次執行時,都會按從左到右的順序處理聲明符。 如果聲明符具有初始值設定項,則會初始化程序集並對其值賦值給變量。
a
是聲明者。 它被評估為產生一個變量(本身)。 然后評估初始化表達式。
這個
new Precedence().s = "My String";
是一個賦值表達式 。 首先計算運算符的左側以生成變量,因此首先計算new Precedence()
,實例化Precedence
類,生成對象的引用。 然后評估賦值的右側, String
文字"My String"
,因此生成對String
對象的引用。 然后,賦值將String
對象的引用分配給由新實例創建表達式返回的值引用的對象的變量s
。
最后,因為
在運行時,賦值表達式的結果是賦值發生后變量的值。
分配給Precedence
對象的字段s
的值也分配給變量a
。
這是字節碼:
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
。 有工具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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.