/ / Jak i dlaczego liczba całkowita pobiera typecast do ciągu String przy użyciu znaku "+"? - Java, casting

W jaki sposób i dlaczego liczba całkowita otrzymuje typecast na ciąg znaków podczas używania "+"? - Java, casting

Podczas gdy wykonuję ten kod, piszę + konwertuje moją liczbę całkowitą na ciąg.

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);
}

}

Nie jestem w stanie zrozumieć, co + robi się tutaj i jak się przekształca w String. Czy ma to coś wspólnego z prawem do zostawienia pierwszeństwa = operator?

Odpowiedzi:

7 dla odpowiedzi № 1

Czy to ma coś wspólnego z pierwszeństwem z prawej do lewej strony = operator?

Odpowiedź: Nie

I tak jest nie ma nic wspólnego z typem Integer. Czemu ? bo Oto co JSL mówić

Konwersja ciągu dotyczy tylko operandu operatora binarnego + który nie jest łańcuchem, gdy drugi operand jest łańcuchem.

W tym pojedynczym przypadku specjalnym operandem innym niż String jest znak + przekonwertowany na ciąg (§5.1.11) i ocena operatora + wpływy określone w §15.18.1.

Więc nawet jeśli napiszesz zmienną innego typu, to ją skonwertuj. Rozważ ten fragment

public static void main(String...string){
double u=9.0;
System.out.println(u+"hi");


}

Daje mi wydajność

9.0hi

Teraz przychodzimy do How?

W przypadku fragmentu kodu, który opublikowałem Oto część skompilowanego kodu tego

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

Więc wewnętrznie się powołuje valueOf() metoda do konwertowania operandu podwójnego lub nie-ciągowego na łańcuch znaków i wywoływania append() całkowicie przekształcić go w String. Mam nadzieję, że to ci pomoże :)


0 dla odpowiedzi nr 2

Chcę, aby odpowiedź była prostsza, dlatego publikuję to.

"+" is the only operator in java that is overloaded for String type for string concatenation.

Jeśli więc którykolwiek z dwóch argumentów to String ... cała operacja jest przeciążona do konkatenacji.

Więc string+(any other datatype) = string. Tak więc dla wszystkich innych operandów użyj parentthesis wraz z ciągiem znaków

Więc 5+5+"" =55

i (5+5)+"" = 10

UWAGA: Nie ma to nic wspólnego z prawem do lewego priorytetu