Chỉ mới bắt đầu sử dụng Java. Tôi tìm thấy rất nhiều điểm tương đồng với .NET, nhưng tôi thấy rằng tất cả các phương thức trong Java là ảo theo mặc định. Vì vậy, câu hỏi là những gì tôi có thể làm để làm cho họ không ảo? Có phải từ khóa final
là giải pháp một và đúng không?Các phương pháp không ảo trong Java
Trả lời
Có hoặc riêng
Nhưng 'riêng tư '- giống như trong .net - làm cho phương thức không khả dụng cho các lớp khác để gọi, cũng như ngăn chặn ghi đè. –
Nhưng tôi có thể làm gì khi tôi cần có một phương thức trong lớp con với cùng tên như trong lớp cha. Trong C# có một từ khóa mới cho các trường hợp như vậy ... là có cái gì đó tương tự trong Java. – NixDev
nope, không có gì ở tất cả –
Thay vì xác định tất cả các phương thức là cuối cùng, bạn cũng có thể xác định toàn bộ lớp là cuối cùng. Tôi không nói liệu phong cách tốt hay xấu này.
Nếu bạn đang muốn làm cho phương pháp không ảo cho hiệu suất, hãy để JIT đối phó với điều đó cho đến khi bạn có bằng chứng cho thấy nó không hoạt động.
Nếu lý do để làm cho phương pháp không ảo là có thể xác định nó trong phân lớp nhưng không liên quan đến đa hình, bạn có thể phân lớp không có lý do thực sự (đăng thêm mã nếu bạn muốn tranh luận).
Nếu đó là thiết kế, tôi khuyên bạn nên tạo lớp cuối cùng thay vì các phương pháp riêng lẻ nếu có thể. IDEA có kiểm tra tốt về thiết kế lớp học. Cố gắng không nghe quá gần với những người muốn bạn để mọi thứ mở để họ có thể phân lớp để hack xung quanh các lỗi hoặc hạn chế; họ sẽ hét to hơn nữa khi bạn vô tình phá vỡ lớp con của họ.
Cung cấp cách để khách hàng thêm loại riêng của họ thay vì phân loại của bạn và có thể họ sẽ không nhận thấy rằng lớp học của bạn là cuối cùng.
Biến nó thành tĩnh.
Nếu bạn gọi phương thức không phải ảo thì bạn muốn biết từ mã của mình mà bạn đang gọi phương thức lớp. Lỗ hổng của .net là bạn không thể biết điều đó từ mã của bạn.
Ví dụ
Trong Java nếu bạn xác định ClassB như
public class ClassB extends ClassA {
@Override
public void run() {
}
}
và đối tượng
ClassA obj=new ClassB();
Nếu bạn gọi obj.run() làm thế nào bạn sẽ biết nếu mã số đó là theo các quy tắc của nguyên tắc mở/đóng đa hình hoặc nó sẽ mã phương pháp liên quan đến ClassA? Trong Java bạn sẽ biết rằng luôn có sự đa hình. Nó là dễ dàng hơn để làm cho mocks và nó được dễ dàng hơn để mở rộng các lớp học và làm theo nguyên tắc thay thế Liskov.
Trên phương pháp tĩnh Mặt khác được bao bọc một lớp vì vậy nếu bạn muốn gọi một phương thức có liên quan đến ClassA bạn có thể xác định rằng phương pháp như thế này:
public static run(ClassA obj)
và bạn có thể gọi nó với
ClassB obj=new ClassB();
ClassA.run(obj);
và từ mã bạn sẽ biết rằng phương thức bạn đang gọi được xác định trong ClassA chứ không phải trong ClassB.
No. Không tạo phương thức tĩnh khi thuộc về đối tượng. Đó thực sự là thiết kế tồi. – Cephalopod
- 1. Java - Phương pháp ảo
- 2. Mocking phương pháp không ảo trong C#
- 3. Phương pháp ảo không được gọi là
- 4. Phương pháp mở rộng ảo?
- 5. C++ phương pháp ảo trọng
- 6. phương pháp phi ảo Overriding
- 7. các phương pháp ảo và các lớp mẫu
- 8. Làm thế nào để quá tải một phương pháp ảo khác với phương pháp phi ảo?
- 9. Giao diện, Tóm tắt hoặc chỉ các phương pháp ảo?
- 10. ghi đè phương pháp ảo C++
- 11. Hiệu suất hoạt động của các phương pháp ảo
- 12. Phương pháp trừu tượng có phải là ảo không?
- 13. khác biệt giữa các phương pháp ảo và trừu tượng
- 14. Tôi có thể sử dụng phương pháp ghi đè phương pháp phi ảo không?
- 15. Phương pháp ràng buộc để phương pháp cơ bản trong thư viện bên ngoài không thể xử lý các phương pháp ảo mới "giữa"
- 16. gọi phương pháp khác từ phương pháp chính trong java
- 17. Java: `Phương pháp static`
- 18. Gọi phương thức ảo trong java là gì?
- 19. Java 8: phương pháp khuyến nông ảo vs lớp trừu tượng
- 20. Các phương pháp thực hiện các phương thức ảo thuần túy của một lớp giao diện có được khai báo ảo không?
- 21. Sử dụng các phương pháp varala vararg trong java
- 22. Phương pháp Java Chạy trong chủ đề
- 23. Phương pháp gọi ma thuật trong Java
- 24. Phương pháp trong C++
- 25. Overriding phương pháp hạn chế trong java
- 26. Java hai varargs trong một phương pháp
- 27. Gọi phương pháp ảo ngay sau khi xây dựng
- 28. phương pháp ảo Overriding khi instantiating một lớp
- 29. phương pháp Generic trong Java mà không generic luận
- 30. get() phương pháp trong Java enum loại
http://download.oracle.com/javase/tutorial/java/IandI/final.html –
Đoán những gì, tôi tìm thấy trong 'C# .NET' rất nhiều điểm tương đồng với' JAVA' ... như ia có một số điểm tương đồng với cha tôi ... –
@Garis Không thể nhận được điểm của bạn ... Làm thế nào nó được kết nối với câu hỏi? – NixDev