Especificação de linguagem Java define E1 op= E2como equivalente a E1 = (T) ((E1) op (E2))onde Té um tipo de E1e E1é avaliada uma vez .
Essa é uma resposta técnica, mas você pode estar se perguntando por que esse é o caso. Bem, vamos considerar o seguinte programa.
public class PlusEquals {
public static void main(String[] args) {
byte a = 1;
byte b = 2;
a = a + b;
System.out.println(a);
}
}
O que esse programa imprime?
Você adivinhou 3? Pena que este programa não será compilado. Por quê? Bem, acontece que a adição de bytes em Java é definida para retornar umint . Acredito que isso ocorreu porque a Java Virtual Machine não define operações de byte para economizar em bytecodes (há um número limitado delas, afinal), usar operações inteiras é um detalhe de implementação exposto em uma linguagem.
Mas se a = a + bnão funcionar, isso significaria a += bque nunca funcionaria para bytes se E1 += E2fosse definido E1 = E1 + E2. Como mostra o exemplo anterior, esse seria realmente o caso. Como um truque para fazer o +=operador trabalhar para bytes e curtos, há uma conversão implícita envolvida. Não é tão bom assim, mas, durante o trabalho do Java 1.0, o foco estava em liberar a linguagem para começar. Agora, devido à compatibilidade com versões anteriores, esse hack introduzido no Java 1.0 não pôde ser removido.