Dies geschieht aufgrund von Binary Numeric Promotion
Wenn ein Operator eine binäre numerische Heraufstufung auf ein Paar von Operanden anwendet, von denen jeder einen Wert angeben muss, der in einen numerischen Typ konvertierbar ist, gelten die folgenden Regeln in der angegebenen Reihenfolge unter Verwendung der erweiterten Konvertierung (§5.1.2) Operanden wie nötig:
- Wenn einer der Operanden einen Referenztyp hat, wird die Unboxing-Konvertierung (§5.1.8) durchgeführt. Dann:
- Wenn einer der Operanden vom Typ double ist, wird der andere in double konvertiert.
- Andernfalls, wenn einer der Operanden vom Typ float ist, wird der andere in float konvertiert.
- Andernfalls, wenn einer der Operanden vom Typ long ist, wird der andere in long konvertiert.
- Ansonsten werden beide Operanden in den Typ int konvertiert.
Grundsätzlich werden beide Operanden in ein int
konvertiert, und dann wird System.out.println(int foo)
aufgerufen. Die einzigen Typen, die von +
, *
usw. zurückgegeben werden können, sind double
, float
, long
und int
'\u0041' + 1
erzeugt int
, Sie müssen es in char
umwandeln, damit javac den Aufruf an println(char
) anstelle von prinln(int)
whatever
ist ein Zeichen und ++whatever
bedeutet whatever = whatever + 1
(Präfixreihenfolge ignoriert)
Da es eine Zuweisung gibt, wird das Ergebnis in char konvertiert, also wird die char-Methode aufgerufen. Aber im 3-4. Druck gibt es keine Zuweisung und gemäß der Regel werden alle Summenoperationen standardmäßig in int ausgeführt. Vor der Druckoperation werden also die char + char
und char+int
zusammengefasst, und da es keine Rückzuweisung gibt, bleibt sie nach der Operation int, so dass die Ganzzahlmethode aufgerufen wird.