Enquanto estou executando este código, escrevendo +
está convertendo meu inteiro em uma String.
public class Test {
public static void main(String...string){
int m=9;
int k=10;
String s=new String(m +"");//automatic type conversion from int to string
String j=m+"" +k;////automatic type conversion from int to string
System.out.println(s+j);
String s1=String.valueOf(m);
System.out.println(s1);
}
}
Eu não consigo entender o que +
está fazendo aqui, e como está sendo convertido em uma String. Isso tem algo a ver com a precedência direita para esquerda do =
operador?
Respostas:
7 para resposta № 1Isso tem algo a ver com a precedência da direita para a esquerda de =
operador?
Responda: Não
E tem não tenho nada a ver com o tipo inteiro também. Porque ? Porque Aqui está o que JSL dizer
A conversão de string aplica-se apenas a um operando do operador binário + que não é uma String quando o outro operando é uma String.
Neste único caso especial, o operando não String para o + é convertido em uma string (§5.1.11) e avaliação do operador + procede conforme especificado em §15.18.1.
Portanto, mesmo se você escrever qualquer outro tipo de variável, ele irá convertê-lo. Considere este trecho
public static void main(String...string){
double u=9.0;
System.out.println(u+"hi");
}
Isso me dá saída
9.0hi
Agora vindo para como?
Para o snippet de código que postei Aqui está a parte do código compilado deste
public static void main(java.lang.String...);
flags: ACC_PUBLIC, ACC_STATIC, ACC_VARARGS
Code:
stack=5, locals=3, args_size=1
0: ldc2_w #16 // double 9.0d
3: dstore_1
4: getstatic #18 // Field java/lang/System.out:Ljav
a/io/PrintStream;
7: new #24 // class java/lang/StringBuilder
10: dup
11: dload_1
12: invokestatic #26 // Method java/lang/String.valueOf
:(D)Ljava/lang/String;
15: invokespecial #32 // Method java/lang/StringBuilder.
"<init>":(Ljava/lang/String;)V
18: ldc #35 // String hi
20: invokevirtual #37 // Method java/lang/StringBuilder.
append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
23: invokevirtual #41 // Method java/lang/StringBuilder.
toString:()Ljava/lang/String;
26: invokevirtual #45 // Method java/io/PrintStream.prin
tln:(Ljava/lang/String;)V
Então, internamente, ele invoca valueOf()
método para converter operando duplo ou não string em String e então invoca append()
para convertê-lo em String totalmente. Espero que isso ajude você :)
0 para resposta № 2
Quero tornar a resposta mais simples, portanto, estou postando isso.
"+" is the only operator in java that is overloaded for String type for string concatenation
.
Portanto, se qualquer um dos dois operandos for String ... toda a operação é sobrecarregada para concatenação.
assim string+(any other datatype) = string.
Então, para quaisquer outros operandos, use parênteses junto com string
assim 5+5+"" =55
e (5+5)+"" = 10
NOTA: Não tem nada a ver com a precedência da direita para a esquerda