Đặc tả ngôn ngữ Java định nghĩa E1 op= E2
tương đương với E1 = (T) ((E1) op (E2))
nơi T
là một loại E1
và E1
được đánh giá một lần .
Đó là một câu trả lời kỹ thuật, nhưng bạn có thể tự hỏi tại sao đó là một trường hợp. Vâng, hãy xem xét các chương trình sau đây.
public class PlusEquals {
public static void main(String[] args) {
byte a = 1;
byte b = 2;
a = a + b;
System.out.println(a);
}
}
Chương trình này in cái gì?
Bạn có đoán được 3 không? Quá tệ, chương trình này sẽ không được biên dịch. Tại sao? Vâng, điều đó xảy ra rằng việc thêm byte trong Java được định nghĩa để trả về mộtint
. Điều này, tôi tin là bởi vì Máy ảo Java không định nghĩa các hoạt động byte để lưu trên mã byte (rốt cuộc, có một số lượng hạn chế), sử dụng các hoạt động số nguyên thay vì là một chi tiết triển khai được thể hiện bằng ngôn ngữ.
Nhưng nếu a = a + b
không hoạt động, điều đó có nghĩa là a += b
sẽ không bao giờ hoạt động đối với byte nếu nó E1 += E2
được xác định là E1 = E1 + E2
. Như ví dụ trước đây cho thấy, đó thực sự là trường hợp. Là một hack để làm cho +=
toán tử hoạt động cho byte và quần short, có một diễn viên ngầm liên quan. Nó không phải là một hack tuyệt vời, nhưng trở lại trong quá trình Java 1.0, trọng tâm là bắt đầu phát hành ngôn ngữ. Bây giờ, vì khả năng tương thích ngược, bản hack được giới thiệu trong Java 1.0 này không thể bị xóa.