2010-09-01 37 views
7

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

+0

http://download.oracle.com/javase/tutorial/java/IandI/final.html –

+5

Đ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 ... –

+5

@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

Trả lời

8

Có hoặc riêng

+5

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 đè. –

+2

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

+1

nope, không có gì ở tất cả –

2

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.

6

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.

1

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.

+2

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

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