2009-01-03 34 views

Trả lời

44

Bạn có thể sử dụng công cụ javap để tự mình xem. Biên dịch đoạn mã sau:

public class AutoboxingTest 
{ 
    public static void main(String []args) 
    { 
     Integer a = 3; 
     int b = a; 
    } 
} 

Để biên dịch và tháo rời:

javac AutoboxingTest.java 
javap -c AutoboxingTest 

Đầu ra là:

Compiled from "AutoboxingTest.java" 
public class AutoboxingTest extends java.lang.Object{ 
public AutoboxingTest(); 
    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_3 
    1: invokestatic #2; //Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer; 
    4: astore_1 
    5: aload_1 
    6: invokevirtual #3; //Method java/lang/Integer.intValue:()I 
    9: istore_2 
    10: return 

} 

Vì vậy, như bạn có thể thấy, autoboxing gọi phương thức tĩnh Integer.valueOf(), và autounboxing gọi intValue() trên đối tượng Integer đã cho. Không có gì khác, thực sự - đó chỉ là cú pháp cú pháp.

+1

Thật thú vị khi lưu ý rằng nó gọi valueOf (int) thay vì Integer mới (int) để chuyển đổi int thành Integer. valueOf thực hiện bộ nhớ đệm đối tượng cho 1000 số nguyên đầu tiên. –

+3

-128 đến 127 được lưu trong bộ nhớ cache –

+0

@Craig: phải chính xác, -128 đến 127 ** phải được lưu trong bộ nhớ cache, các giá trị khác có thể được lưu trong bộ nhớ cache bằng cách triển khai. –

1

Tôi khuyên bạn nên nhận một số thứ như jad và giải mã mã nhiều. Bạn có thể tìm hiểu khá nhiều về những gì java thực sự đang làm.

9

Tôi đã đưa ra một bài kiểm tra đơn vị chứng minh rằng Integer.valueOf() được gọi thay vì hàm tạo của trình bao bọc.

import static org.junit.Assert.assertNotSame; 
import static org.junit.Assert.assertSame; 

import org.junit.Test; 

public class Boxing { 
    @Test 
    public void boxing() { 
     assertSame(5, 5); 
     assertNotSame(1000, 1000); 
    } 
} 
4

Nếu bạn tra cứu tài liệu API cho Integer#valueOf(int), bạn sẽ thấy tài liệu được thêm vào JDK 1.5. Tất cả các loại trình bao bọc (chưa có chúng) đều có các phương thức tương tự được thêm vào để hỗ trợ tự động đóng hộp. Đối với một số loại có một yêu cầu bổ sung, như mô tả trong JLS:

Nếu giá trị p được đóng hộp là true, false, một byte, một char trong khoảng \u0000 để \u007f, hoặc một int hay short số giữa -128127, sau đó để r1r2 là kết quả của bất kỳ hai chuyển đổi đấm bốc của p. Luôn luôn là trường hợp r1 == r2. §5.1.7

Thật thú vị khi lưu ý rằng long s không phải chịu các yêu cầu tương tự, mặc dù giá trị dài trong khoảng -128..127 được lưu trữ trong việc thực hiện của Sun, giống như các loại không thể thiếu khác.

Tôi cũng chỉ phát hiện ra rằng trong bản sao của tôi The Java Programming Language, nó nói char giá trị từ \u0000 để \u00ff được lưu trữ, nhưng tất nhiên giới hạn trên mỗi spec là \u007f (và Sun JDK phù hợp với spec trong trường hợp này) .

Các vấn đề liên quan