簡體   English   中英

+運算符如何在Java中工作?

[英]How does + operator work in Java?

我在下面提供了一些編譯類的代碼。

public class PlusOperator {

public static void main(String[] args) {

    int a=10;
    int b=20;
    int c =a+b;

    String s1 = 1+3+"f";
    String s2 = "f"+1+2;
    String s3 = (1+3)+"f";
    String s4 = "f"+(1+3);

}
}

使用Java 1.6編譯的類

  // Compiled from PlusOperator.java (version 1.6 : 50.0, super bit)
public class question.PlusOperator {

  // Method descriptor #6 ()V
  // Stack: 1, Locals: 1
  public PlusOperator();
    0  aload_0 [this]
    1  invokespecial java.lang.Object() [8]
    4  return
      Line numbers:
        [pc: 0, line: 3]
      Local variable table:
        [pc: 0, pc: 5] local: this index: 0 type: question.PlusOperator

  // Method descriptor #15 ([Ljava/lang/String;)V
  // Stack: 2, Locals: 8
  public static void main(java.lang.String[] args);
     0  bipush 10
     2  istore_1 [a]
     3  bipush 20
     5  istore_2 [b]
     6  iload_1 [a]
     7  iload_2 [b]
     8  iadd
     9  istore_3 [c]
    10  ldc <String "4f"> [16]
    12  astore 4 [s1]
    14  ldc <String "f12"> [18]
    16  astore 5 [s2]
    18  ldc <String "4f"> [16]
    20  astore 6 [s3]
    22  ldc <String "f4"> [20]
    24  astore 7 [s4]
    26  return
      Line numbers:
        [pc: 0, line: 7]
        [pc: 3, line: 8]
        [pc: 6, line: 9]
        [pc: 10, line: 11]
        [pc: 14, line: 12]
        [pc: 18, line: 13]
        [pc: 22, line: 14]
        [pc: 26, line: 16]
      Local variable table:
        [pc: 0, pc: 27] local: args index: 0 type: java.lang.String[]
        [pc: 3, pc: 27] local: a index: 1 type: int
        [pc: 6, pc: 27] local: b index: 2 type: int
        [pc: 10, pc: 27] local: c index: 3 type: int
        [pc: 14, pc: 27] local: s1 index: 4 type: java.lang.String
        [pc: 18, pc: 27] local: s2 index: 5 type: java.lang.String
        [pc: 22, pc: 27] local: s3 index: 6 type: java.lang.String
        [pc: 26, pc: 27] local: s4 index: 7 type: java.lang.String
}

我的問題:

  1. +運算符如何使用String和int?
  2. 如果您看到已編譯的代碼,則在編譯時也會使用int計算字符串“+”,但在“+”的情況下,僅在運行時執行int。 為什么?

ab是變量 - 它們的值僅在運行時1中已知。 但是, 1f3是常量,因此編譯器足夠聰明,可以計算結果並將其包含在字節碼中。 因此,像3 + f這樣的表達式會自動編譯為常量3f

這與intString類型的操作數無關。 嘗試使用String s:

String str = a + b;

你會在編譯的代碼中看到對StringBuilder#append(String)的調用。


1異常是當變量被聲明為final ,因此在以下代碼中:

final int a=10;
final int b=20;
int c = a + b;

c在字節碼中直接賦值為30

bipush 10
istore_1
bipush 20
istore_2
bipush 30
istore_3

您將深入了解編譯器的工作方式。 它正在解析您的代碼,然后可行將其轉換為字節碼。 如果在字符串中使用“+”運算符,則如果在二進制表達式中使用它,則它將單向運行,然后它將作用於另一個。 操作員超載。

  1. “+”運算符過載。

  2. 這是在編譯器中完成的代碼優化。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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