簡體   English   中英

@override注釋

[英]@override annotation

實現接口時是否需要輸入@Override注釋(不覆蓋抽象類)?

@Override注釋實現了什么?

在Java 5中,在實現從接口繼承的方法時,不能添加@Override ,在Java 6中,您應該(或者您將獲得編譯器警告)。

@Override聲明一個方法旨在覆蓋某些東西,並且如果不是或不再是這種情況,將導致編譯器通知您,例如因為您重寫的方法已被重命名。

如果你說你實際上沒有覆蓋某些東西,它會打破你的編譯。

如果您沒有放置@Override標記,但根據編譯器您沒有覆蓋任何內容,則會出現一個您不知道的無提示錯誤。 使用@Override標記,您就可以了解它,現在就知道它,而不是以后。

永遠不需要放置@Override注釋。 但我建議每次都這樣做。

@Override注釋通知編譯器該元素旨在覆蓋超類中聲明的元素。

它不是必需的,但如果該方法實際上沒有正確覆蓋超類中的方法,它將生成編譯錯誤。

@override基本上強制編譯器檢查你是否真的覆蓋了現有的基類方法,而不是簡單地(意外地)創建新方法。

總是使用@Override是一個好習慣,因為它可以幫助你搶先捕獲一些其他陰險的錯誤。 它還增強了代碼清晰度。 例如,查看Effective Java ,第6章,第36項中給出的示例:

// Can you spot the bug? - Page 176
package org.effectivejava.examples.chapter06.item36;

import java.util.HashSet;
import java.util.Set;

public class Bigram {
    private final char first;
    private final char second;

    public Bigram(char first, char second) {
        this.first = first;
        this.second = second;
    }

    public boolean equals(Bigram b) {
        return b.first == first && b.second == second;
    }

    public int hashCode() {
        return 31 * first + second;
    }

    public static void main(String[] args) {
        Set<Bigram> s = new HashSet<Bigram>();
        for (int i = 0; i < 10; i++)
            for (char ch = 'a'; ch <= 'z'; ch++)
                s.add(new Bigram(ch, ch));
        System.out.println(s.size());
    }
}

這種方法乍一看可能看起來不錯,但事實上它已經破碎了! 程序員沒有遵循equals(Object o)的契約,而是實現equals(Bigram b) ,在執行依賴於equals()事情時不會調用它們。 即,將Bigram實例插入Map 因此,這將導致難以追蹤的混亂,微妙的錯誤行為,而如果程序員剛剛首先使用了@Override ,編譯器會立即提醒他們解決問題。

不,Java不會綁定您在實現接口時放置@Override注釋。 您可以像往常一樣覆蓋在interface中聲明的方法。 但是,在覆蓋接口或任何父類(包括抽象類)的方法時,使用@Override注釋是一種很好的做法。 為什么? 因為它幫助我們/編譯器識別在編譯本身時覆蓋方法的任何問題。

例如: http//java-dive.blogspot.in/

 class Ball{
        public void bounce(){
        }
        } 

//////////////////////Override without @Override/////////////////////////////

    public class FootBall{
    public void bounce(String s){
    }
    }

//this will compile however new FootBall().bounce(); will call parent method.

//////////////////////Override with @Override/////////////////////////////

    public class FootBall{
    @Override
    public void bounce(String s){
    }
    }

//This will not compile as the parent class doent have any method with signature bounce(String s)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM