Ответ 1
Я думаю, книга предлагает использовать +=
как лучшую практику. Действительно, нет разницы между двумя утверждениями sum += i
и sum = sum + i
Я реализую 2 класса, каждый из которых включает один оператор и наблюдаю за байтовым кодом командой javap
Вот программа 1:
public class Program1 {
public static void main(String []args) {
int i = 1;
int sum = 2;
sum += i;
}
}
Вот код байта:
public class Program1 {
public Program1();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: return
public static void main(java.lang.String[]);
Code:
0: iconst_1
1: istore_1
2: iconst_2
3: istore_2
4: iload_1
5: iload_2
6: iadd
7: istore_1
8: return
}
Вот программа 2:
public class Program2 {
public static void main(String []args) {
int i = 1;
int sum = 2;
sum = sum + i;
}
}
Вот код байта:
public class Program2 {
public Program2();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: return
public static void main(java.lang.String[]);
Code:
0: iconst_1
1: istore_1
2: iconst_2
3: istore_2
4: iload_1
5: iload_2
6: iadd
7: istore_1
8: return
}
Как видно выше, байт-коды являются одинаковыми, поэтому утверждения одинаковы. Нет разницы.
Изменить 1: Как запустить команду javap
- Сохранить Program1.java в java файле
- Скомпилируйте код. Выполнить
javac Program1.java
- Как Program1, так и Program2 должны успешно компилироваться.
- Запустите
javap -c Program1.class
, чтобы увидеть байт-код.
Изменить 2: Разница между операторами, если разные типы переменных
Оператор +=
имеет неявный оператор cast to left, поэтому, если переменные различаются по своим типам +=
operator wil automaticaly cast.
Вот код
long i = 1;
int sum = 2;
sum += i; //means sum = (int)(i + sum)
Кроме того, sum = sum + i
не имеют неявного выражения, этот оператор не будет компилироваться.
В общем случае я использую явное литье, если есть необходимость бросить. Это делает код более читабельным и безопасным.