Như mọi người đã nêu, dấu + = có một dàn diễn viên tiềm ẩn. Để giúp minh họa điều đó, tôi sẽ sử dụng một ứng dụng mà tôi đã viết trong khi đó là hoàn hảo cho các loại câu hỏi này. Đây là một bộ phận phân tách trực tuyến để bạn có thể kiểm tra bytecode thực tế đó là được sản xuất: http://javabytes.herokuapp.com/
Và một bảng ý nghĩa của chúng: http://en.wikipedia.org/wiki/Java_bytecode_instruction_listings
Vì vậy, chúng ta hãy nhìn vào bytecode từ một số mã Java đơn giản:
int i = 5;
long j = 8;
i += j;
Mã chưa được tháo rời. Nhận xét của tôi sẽ có // ở phía trước.
Code:
0: iconst_5 //load int 5 onto stack
1: istore_0 //store int value into variable 0 (we called it i)
2: ldc2_w #2; //long 8l
//load long 8 value onto stack. Note the long 8l above
//is not my comment but how the disassembled code displays
//the value long 8 being used with the ldc2_w instruction
5: lstore_1 //store long value into variable 1 (we called it j)
6: iload_0 //load int value from variable 0
7: i2l //convert int into a long. At this point we have 5 long
8: lload_1 //load value from variable 1
9: ladd //add the two values together. We are adding two longs
//so it's no problem
10: l2i //THIS IS THE MAGIC. This converts the sum back to an int
11: istore_0 //store in variable 0 (we called it i)
bạn có thể cung cấp một số liên kết để đọc thêm không? Cảm ơn – hhafez
tôi nghĩ rằng "sâu" lý do là bởi vì nó không được phép gán trong khi thu hẹp: byte = int là không được phép và int = đôi quá. sẽ làm một byte đơn giản a; a + = 2; và không biên dịch được, mọi người sẽ ném giày vào java. nhưng tôi vẫn muốn có thêm quy tắc mà làm cho nó hoạt động mà không có diễn viên: ( –
Tôi không chắc chắn có một lý do sâu sắc, nhưng đặc tả ngôn ngữ Java xác định rõ ràng các diễn viên tiềm ẩn: http://java.sun.com/ docs/books/jls/second_edition/html/expressions.doc.html # 5304 – DefLog