Number n = new Number(5)
là bất hợp pháp, nhưng Number n = 5
thì không. Tại sao?Nếu số lớp là trừu tượng tại sao tôi được phép viết Số n = 5?
Trả lời
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
.
Về cơ bản, đó là vì Number
là một lớp trừu tượng - có là 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).
lý do tại sao nó phải là một lớp tĩnh? –
+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
@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). –
Không được. autoboxing là một sai lầm lớn.
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
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);
- 1. Tại sao lớp HttpServlet được khai báo là trừu tượng?
- 2. "không thể tồn tại trừu tượng trên kiểu tham số ..."
- 3. Lớp trừu tượng là gì?
- 4. Tại sao tôi không thể lấy được từ lớp trừu tượng System.Enum?
- 5. Tại sao ParameterizedThreadStart chỉ cho phép tham số đối tượng?
- 6. Nếu một lớp trừu tượng có serialVersionUID
- 7. lớp trừu tượng tĩnh
- 8. Lớp 'Phòng' là trừu tượng; không thể được khởi tạo
- 9. Tại sao tôi nên khai báo một destructor ảo cho một lớp trừu tượng trong C++?
- 10. C++ tham số lớp trừu tượng lỗi workaround
- 11. Lợi thế nếu tôi sử dụng lớp trừu tượng trong php là gì?
- 12. Là một nhà xây dựng công cộng trong một lớp trừu tượng một mã số?
- 13. Tại sao "loại lớp" được gọi là "loại lớp"?
- 14. Lớp trừu tượng bắt nguồn từ lớp không trừu tượng
- 15. Tại sao tuyên bố giao diện là trừu tượng?
- 16. Tại sao chúng ta cần giao diện khi lớp trừu tượng tồn tại?
- 17. JAXB và lớp trừu tượng
- 18. viết C# thực hiện nội tuyến lớp trừu tượng?
- 19. "trừu tượng" là gì?
- 20. Sao chép constructor: sâu sao chép một lớp trừu tượng
- 21. Tại sao ngôn ngữ lập trình cho phép gán từ số nguyên thành viết tắt?
- 22. một lớp trừu tượng được thừa hưởng một vấn đề khác lớp trừu tượng
- 23. tại sao hằng số java được khai báo là tĩnh?
- 24. C# Làm rõ lớp trừu tượng
- 25. Tại sao thành viên kế thừa không được phép?
- 26. Tại sao Java cho phép đa kế thừa từ giao diện nhưng không phải từ lớp trừu tượng/bê tông
- 27. AS3 - Lớp trừu tượng
- 28. Thêm ràng buộc tham số kiểu để ngăn các lớp trừu tượng
- 29. Tại sao tôi được phép sao chép unique_ptr?
- 30. Tại sao android.app.Activity không trừu tượng theo thiết kế?
Để xác minh điều này mình chỉ cần thêm System.out.println (n.getClass() getName().); – Buhb
Câu hỏi chủ yếu về các lớp trừu tượng. – whiskeysierra
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