簡體   English   中英

為什么 + 在 Java 中使用字符串?

[英]Why does + work with Strings in Java?

Java 不能進行運算符重載,但+StringInteger以及其他一些類可以正常工作。 這怎么可能?

更新:
為什么這樣做?

Integer i = 4;
Integer p = 5;

System.out.println(i*p); // prints 20

+不是運算符重載的示例。 +作為連接運算符算術加法運算符內置於語言中。

這意味着用 Java 編寫程序的人不能重載運算符,但就 Java 語言的語法而言, +被定義為連接和加法運算符。

編輯

由於自動裝箱,它適用於其他類,例如IntegerDouble

如果您查看執行字符串連接的 Java 程序的字節碼,您會看到它創建了StringBuilder並使用了append()方法。 Java 編譯器看到+運算符並意識到操作數是字符串而不是原始類型(如int )。

如果您查看執行整數加法的程序的字節碼,您會看到它使用iadd指令執行整數加法。 這是因為編譯器意識到+操作的操作數是整數。

至於做類似Integer i = 4事情,字節碼會顯示你實際上在做Integer i = Integer.valueOf(4) 這稱為自動裝箱。 稍后,當您執行類似i + p ,其中ip都是Integer類型,生成的字節碼將顯示您正在執行i.intValue() + p.intValue() ,其中兩者的返回類型方法是int (實際的字節碼指令又是iadd )。

這就是為什么+可以工作Integer即使它們不是實際的原始類型。

由於自動裝箱,它適用於像 Integer 這樣的原始包裝器。

它適用於 String ,因為這是連接字符串特殊情況

Java 語言為字符串連接運算符 ( + ) 以及將其他對象轉換為字符串提供了特殊支持。 字符串連接是通過 StringBuilder(或 StringBuffer)類及其 append 方法實現的。 字符串轉換通過toString方法實現,由Object定義,Java中所有類都繼承。 有關字符串串聯和轉換的其他信息,請參閱 Gosling、Joy 和 Steele,Java 語言規范。

+是一個內置操作。 這是一個例外,而不是規則。

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的地方。 原語首先被轉換成它們的引用類型IntegerDouble 、&c。 — 然后通過toString()方法進入String

另一種特殊情況是當一個String和一個非String與字符串連接運算符+ ,如JLS §5.4 — String Conversion 中所述

為完整起見: +在其更常見的“將數字加在一起”的作用在 §15.18, §15.18.2的另一部分中進行了描述- 數字類型的加法運算符(+ 和 -)

暫無
暫無

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

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