[英]Why does + work with Strings in Java?
Java 不能進行運算符重載,但+
對String
和Integer
以及其他一些類可以正常工作。 這怎么可能?
更新:
為什么這樣做?
Integer i = 4;
Integer p = 5;
System.out.println(i*p); // prints 20
+
不是運算符重載的示例。 +
作為連接運算符和算術加法運算符內置於語言中。
這意味着用 Java 編寫程序的人不能重載運算符,但就 Java 語言的語法而言, +
被定義為連接和加法運算符。
編輯
由於自動裝箱,它適用於其他類,例如Integer
和Double
。
如果您查看執行字符串連接的 Java 程序的字節碼,您會看到它創建了StringBuilder
並使用了append()
方法。 Java 編譯器看到+
運算符並意識到操作數是字符串而不是原始類型(如int
)。
如果您查看執行整數加法的程序的字節碼,您會看到它使用iadd
指令執行整數加法。 這是因為編譯器意識到+
操作的操作數是整數。
至於做類似Integer i = 4
事情,字節碼會顯示你實際上在做Integer i = Integer.valueOf(4)
。 這稱為自動裝箱。 稍后,當您執行類似i + p
,其中i
和p
都是Integer
類型,生成的字節碼將顯示您正在執行i.intValue() + p.intValue()
,其中兩者的返回類型方法是int
(實際的字節碼指令又是iadd
)。
這就是為什么+
可以工作Integer
即使它們不是實際的原始類型。
+
是一個內置操作。 這是一個例外,而不是規則。
Java 不允許自定義運算符重載,但編譯器開發人員仍然可以告訴編譯器 String1 + String2 == String1String2,並替換 + 運算符的正確連接方法調用。
Java 語言為字符串連接運算符 ( + ) 以及將其他對象轉換為字符串提供了特殊支持。
String s = "string 1" + "string 2";
實際執行的是
(new StringBuilder()).append("string 1").append("string 2").toString()
正如@yan 所說,這是例外,而不是規則。 字符串在 Java 中具有特殊的地位。 Java 語言規范中有一個完整的小節專門針對+
作為字符串連接運算符的作用:第15.18.1 節。
關於您的更新,這是另一個特殊情況。 Java是有時,視情況而定,足夠聰明到事情是不是轉換String
s轉換String
■當String
都需要秒。 其中一種特殊情況是您所描述的,其中原語出現在需要String
的地方。 原語首先被轉換成它們的引用類型Integer
、 Double
、&c。 — 然后通過toString()
方法進入String
。
另一種特殊情況是當一個String
和一個非String
與字符串連接運算符+
,如JLS §5.4 — String Conversion 中所述。
為完整起見: +
在其更常見的“將數字加在一起”的作用在 §15.18, §15.18.2的另一部分中進行了描述- 數字類型的加法運算符(+ 和 -) 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.