2009-12-16 27 views

Trả lời

26

Vì hộp tự động. 5 không phải là một đối tượng để nó được bao bọc vào một đối tượng (Integer trong trường hợp này) và Integer là một Number.

+1

Để xác minh điều này mình chỉ cần thêm System.out.println (n.getClass() getName().); – Buhb

+0

Câu hỏi chủ yếu về các lớp trừu tượng. – whiskeysierra

+1

Không, đó là về "làm thế nào để' Số n = 5; 'hoạt động nếu' Số' là trừu tượng? "Xem ở trên để biết cách thực hiện. :) – Bombe

4

Về cơ bản, đó là vì Number là một lớp trừu tượng - có không có constructor tương ứng với Number(5), và thậm chí nếu có bạn vẫn sẽ không thể nhanh chóng lớp trực tiếp vì nó trừu tượng.

Như Bombe giải thích, trong trường hợp thứ hai của bạn, bạn đang thực sự tạo đối tượng Integer * - với lớp con là Number, có thể được gán cho biến đó. Và vì đó là một lớp cụ thể, bạn có thể khởi tạo nó. * Mặc dù trong thực tế nó thực sự tương đương với Integer.valueOf(5), mà trên Sun JREs sẽ không tạo ra một đối tượng Integer bổ sung nhưng sẽ sử dụng một phiên bản gộp (giống như mô hình Flyweight).

+0

lý do tại sao nó phải là một lớp tĩnh? –

+0

+1 câu trả lời của bạn tốt hơn Bombe, anh ấy thậm chí không sử dụng từ trừu tượng trong câu trả lời của anh ấy, đó là câu hỏi về – whiskeysierra

+0

@Carlos - Tôi có nghĩa là lớp * bê tông, không tĩnh; Tôi đã sửa lỗi đánh máy này ("thinko"?), Cảm ơn vì đã chỉ ra nó. AFAIK không có những thứ như một lớp tĩnh (bỏ qua các lớp bên trong tĩnh là một điều riêng biệt). –

-2

Không được. autoboxing là một sai lầm lớn.

+4

Tôi phải không đồng ý. int là sai lầm. Ngôn ngữ sẽ đơn giản hơn mọi thứ được định nghĩa là một số nguyên (hoặc dài hoặc bất kỳ lớp con nào của số.) Sau đó, để trình biên dịch tối ưu hóa nó thành một int (hoặc bất kỳ nguyên thủy nào.) Tất nhiên nó sẽ phải xử lý == theo cách sane . – MrJacqes

3

Nó tương tự như cách sau đây sẽ làm việc:

List bob = new ArrayList(); 

Danh sách là một giao diện, vì vậy bạn không thể nhanh chóng nó trực tiếp. Tuy nhiên, bạn có thể khai báo một biến kiểu List và gán cho nó một đối tượng cụ thể để thực hiện giao diện đó. Dọc theo cùng một dòng, bạn có thể khai báo một biến kiểu Number và sau đó gán cho nó bất kỳ đối tượng value nào là một instance cụ thể của kiểu đó. Những gì bạn đã làm với mã chức năng là, đối với tất cả ý nghĩa và mục đích (do autoboxing):

Number n = new Integer(5); 
Các vấn đề liên quan