2010-03-22 30 views
13
public class Animal { 
    public void eat() { System.out.println("I eat like a generic Animal."); } 

} 

public class Wolf extends Animal { 
    @Override 
    public void eat() { System.out.println("I eat like a wolf!"); } 
} 

@Override thực sự có một số chức năng hay chỉ là nhận xét bình thường?Có gì "@Override" ở đó trong java?

+0

Trùng lặp: http://stackoverflow.com/questions/94361/when-do-you-use-javas-override-annotation-and-why –

Trả lời

21

Từ Hướng dẫn Java trên annotations:

@Override - các @Override chú thích thông báo cho trình biên dịch rằng phần tử có nghĩa là để ghi đè lên một yếu tố khai báo trong một lớp cha (trọng phương pháp này sẽ được thảo luận trong bài học có tiêu đề "Giao diện và Thừa kế").

// mark method as a superclass method 
    // that has been overridden 
    @Override 
    int overriddenMethod() { } 

Trong khi nó không cần thiết để sử dụng chú thích này khi trọng một phương pháp, nó giúp ngăn ngừa sai sót. Nếu phương thức được đánh dấu bằng @Override không thể ghi đè chính xác phương thức ở một trong các lớp bậc trên , trình biên dịch sẽ phát sinh lỗi.

Hãy xem ví dụ được đưa ra trong thông số kỹ thuật Ngôn ngữ Java, 9.6.1.4 Override. Hãy nói rằng bạn muốn ghi đè lên một phương pháp, equals trong trường hợp đó, nhưng bạn đã viết:

public boolean equals(Foo that) { ... } 

thay vì:

public boolean equals(Object that) { ... } 

Trong khi mã này là hợp pháp, chú thích việc kê khai equals phương pháp với @Override sẽ kích hoạt một lỗi thời gian biên dịch bởi vì bạn đang ở trong thực tế không ghi đè nó, bạn đang quá tải nó. Điều này có thể gây ra các lỗi khó chịu và loại chú thích Override giúp phát hiện sớm chúng.

+0

Vì vậy, nó không ảnh hưởng đến hành vi thời gian chạy, phải không? – symfony

+0

Đúng. Nó sẽ không ảnh hưởng đến bất cứ điều gì sau khi xây dựng thời gian. –

+0

Tuy nhiên, nó sẽ ngăn chặn các bản dựng bị lỗi. – Thilo

11

Ghi đè ghi đè là chú giải thời gian biên dịch, làm cho trình biên dịch java đưa ra lỗi nếu phương pháp có chú thích này thực sự không ghi đè phương thức lớp cha. Bạn có thể cố gắng thay đổi lớp học sói để không mở rộng lớp học Động vật và nếu ghi đè lên chú thích có mặt, nó sẽ hiển thị cho bạn một lỗi thời gian biên dịch

+0

http://java.sun.com/j2se/1.5.0 /docs/api/java/lang/Override.html – Woot4Moo

+1

@symfony Không có mã nào ở trên. Nhưng nếu bạn mispelled ăn như ăn và không có @override, sau đó trình biên dịch sẽ nghĩ rằng bạn đang tạo ra một phương pháp mới và sẽ biên dịch tốt mà không có cảnh báo. Nó cho phép trình biên dịch tìm lỗi. Thông thường nó giúp các nhà phát triển tìm thấy sai lầm đã được sử dụng sai loại trong một tham số phương pháp, chẳng hạn như làm 'công boolean bằng (MyObject o)' thay vì 'công boolean bằng (Object o)'. –

+0

Cuối cùng, có phân biệt chữ hoa chữ thường không? Tôi thấy bạn viết @override thay vì @Override – symfony

0

Nó hoạt động như một nhận xét, nhưng cũng như xác nhận rằng bạn thực sự ĐANG đang ghi đè điều gì đó. Nếu bạn sử dụng @Override, nhưng nó không thực sự ghi đè lên bất cứ điều gì, trình biên dịch sẽ tạo ra một lỗi. See the documentation page for more details.

0

Nếu bạn loại bỏ phương thức "ăn" khỏi lớp cha hoặc viết sai chính tả là "ăn" trong lớp con, mã của bạn bây giờ sẽ không biên dịch được. Nếu không có chú thích "@Override", bạn có thể thực hiện hoặc mã của bạn vẫn sẽ biên dịch, nó sẽ không làm những gì bạn muốn (cụ thể là, ghi đè lên một phương thức).

0

Nó không làm bất cứ điều gì tại thời gian chạy, nhưng nó giúp bạn nắm bắt lỗi:

Nếu bạn nghĩ rằng bạn sẽ ghi đè lên một phương pháp, nhưng không (vì một vấn đề speling hoặc tham số loại), mà không chú thích, mã sẽ biên dịch thành một cái gì đó vô ích (như trong: phương thức của bạn sẽ không được gọi, nhưng phương thức siêu lớp mà bạn vô tình không ghi đè được gọi).

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