簡體   English   中英

Java運算符優先級示例

[英]Java Operator Precedence example

我知道運算符優先級列表 ,但我無法弄清楚“LINE 1”中此代碼中的執行優先級。 之前創建了什么對象? 例如: My Stringnew 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

這顯示以下執行順序:

  1. 創建Precedence對象。
  2. My String常量分配給Precedence.s
  3. 也將它分配給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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM