Java 不带双引号的字符串追加

Java 不带双引号的字符串追加,java,string,append,operator-keyword,double-quotes,Java,String,Append,Operator Keyword,Double Quotes,我是java的初学者。我对字符串的+=操作有疑问。为什么我可以使用+=操作符附加字符串对象而不使用双引号 例如,我在这段代码中没有发现编译器错误 String s1 = "abc"; String s1+=42; 当我真的认为我必须使用s1+=“42” 该行是有效的,然后def是另一个Java字符串。由于它已成功编译,因此在代码中的某些地方 String def ="someDeclaredStringBefore"; **Update:** 为了弄清楚这里发生了什么,首先让我们看看+是

我是java的初学者。我对字符串的
+=
操作有疑问。为什么我可以使用
+=
操作符附加字符串对象而不使用双引号

例如,我在这段代码中没有发现编译器错误

String s1 = "abc";
String s1+=42;
当我真的认为我必须使用
s1+=“42”

该行是有效的,然后
def
是另一个Java字符串。由于它已成功编译,因此在代码中的某些地方

 String def ="someDeclaredStringBefore";

**Update:**
为了弄清楚这里发生了什么,首先让我们看看
+
是如何处理字符串的

它使用StringBuilder追加方法。前

 StringBuilder compilerGeneratedBuilder = new StringBuilder();  
 compilerGeneratedBuilder.append("str");  
 compilerGeneratedBuilder.append("ingcon");  
 compilerGeneratedBuilder.append("catenation");  
 String finalString = compilerGeneratedBuilder.toString();
我最近在这里写的完整故事:

当您编写
字符串r+=42


因为您正在尝试添加
int
值。相应的方法调用StringBuilder并生成最终字符串。

使用此代码模拟上述问题:

    String s = "asd";
    s+=42;
    System.out.println(s);
将导致此字节码:

 Code:
      0: ldc           #16                 // String asd
      2: astore_1
      3: new           #18                 // class java/lang/StringBuilder
      6: dup
      7: aload_1
      8: invokestatic  #20                 // Method java/lang/String.valueOf:(
java/lang/Object;)Ljava/lang/String;
     11: invokespecial #26                 // Method java/lang/StringBuilder."<
nit>":(Ljava/lang/String;)V
     14: bipush        42
     16: invokevirtual #29                 // Method java/lang/StringBuilder.ap
end:(I)Ljava/lang/StringBuilder;
     19: invokevirtual #33                 // Method java/lang/StringBuilder.to
tring:()Ljava/lang/String;
     22: astore_1
     23: getstatic     #37                 // Field java/lang/System.out:Ljava/
o/PrintStream;
     26: aload_1
     27: invokevirtual #43                 // Method java/io/PrintStream.printl
:(Ljava/lang/String;)V
     30: return
这是因为42是一个
int

加号
+
在Java中是一个重载的运算符。它可以添加数字或附加字符串

  • 如果在两个数字上都使用
    +
    ,它将添加它

    System.out.println(1+1)//2

  • 如果在两个字符串上都使用它,它将附加这些字符串

    System.out.println(“abc”+“def”)//abcdef

  • 如果在数字和字符串的组合中使用它,它只会将其附加在一起

    System.out.println(1+“1”)//11


  • 有关详细信息

    范围中是否有名为
    def
    的变量?对这个问题有很好的解释,它不一定是
    字符串
    。哦,他们刚刚更新了他们的问题。@SotiriosDelimanolis谢谢注意。我刚写完就退出了这个页面。不知道编辑的事。我也编辑了这篇文章。找到JLS的相关部分并引用它不是更好吗?查看编译器输出是粗糙的。。。如果这是一个编译器错误怎么办?@nem如果您使用的是windows,请转到命令提示符并将
    cd放入\u项目/bin的\u文件夹中,然后使用类的
    javap-c名称
    
     Code:
          0: ldc           #16                 // String asd
          2: astore_1
          3: new           #18                 // class java/lang/StringBuilder
          6: dup
          7: aload_1
          8: invokestatic  #20                 // Method java/lang/String.valueOf:(
    java/lang/Object;)Ljava/lang/String;
         11: invokespecial #26                 // Method java/lang/StringBuilder."<
    nit>":(Ljava/lang/String;)V
         14: bipush        42
         16: invokevirtual #29                 // Method java/lang/StringBuilder.ap
    end:(I)Ljava/lang/StringBuilder;
         19: invokevirtual #33                 // Method java/lang/StringBuilder.to
    tring:()Ljava/lang/String;
         22: astore_1
         23: getstatic     #37                 // Field java/lang/System.out:Ljava/
    o/PrintStream;
         26: aload_1
         27: invokevirtual #43                 // Method java/io/PrintStream.printl
    :(Ljava/lang/String;)V
         30: return
    
    Any type may be converted to type String by string conversion.
    
    A value x of primitive type T is first converted to a reference value as if by giving it as an argument to an appropriate class instance creation expression (§15.9):
    
    If T is boolean, then use new Boolean(x).
    
    If T is char, then use new Character(x).
    
    If T is byte, short, or int, then use new Integer(x).
    
    If T is long, then use new Long(x).
    
    If T is float, then use new Float(x).
    
    If T is double, then use new Double(x).
    
    This reference value is then converted to type String by string conversion.
    Now only reference values need to be considered:
    
    If the reference is null, it is converted to the string "null" (four ASCII characters n, u, l, l).
    
    Otherwise, the conversion is performed as if by an invocation of the toString method of the referenced object with no arguments; but if the result of invoking the toString method is null, then the string "null" is used instead.
    
    String s1 = "abc";
    String s1+=42;