@ override аннотация - PullRequest
       0

@ override аннотация

10 голосов
/ 23 августа 2011

Может кто-нибудь сказать мне, если этот код:

public class OvTester {
    @Override
    public int hashCode() {
        return toString().hashCode();
    }
}

определяет, что метод toString в классе OvTester переопределяет метод toString в его суперклассе.

IХотелось бы узнать, правда ли это, и если да, то как это работает?

Если это не так, то так ли это:

"метод hashCode() в OvTester должен переопределить метод того же имени в своем суперклассе "

?

Если это не правильно, тогда что является правильным?

Ответы [ 6 ]

14 голосов
/ 23 августа 2011

Переопределение метода происходит, когда вы переопределяете метод с той же сигнатурой в подклассе.

Таким образом, здесь вы переопределяете hashCode(), а не toString()

Аннотация @Overrideнеобязательно (но очень хорошая вещь) и указывает, что это, как ожидается, будет переопределено.Если вы что-то неправильно написали или у вас есть неверно введенный параметр, компилятор предупредит вас.

Так что да, 2-е утверждение верно (и суперкласс в этом случае - java.lang.Object)

2 голосов
/ 23 августа 2011

Я хотел бы знать, правда ли это, и если да, то как это работает?

Нет, это не совсем такtrue.

В аннотации @Overrides говорится, что « этот метод переопределяет метод с тем же именем в суперклассе ».

Inв этом случае hashCode из OvTester переопределяет hashCode в Object.

, если это не так, то это правда: метод hashCode()в OvTester должен переопределить метод с тем же именем в своем суперклассе?

Да.Именно так оно и работает.


Когда один метод не делает ничего другого, кроме как вызвать другой метод (почти то, что вы получили в вашем примере), его обычно называют метод делегирования .Возможно, это то, с чем вы путаете это.

1 голос
/ 23 августа 2011

Аннотация @Override ничего не "определяет".Это просто флаг, который указывает компилятору выдавать ошибку, если аннотированный метод не переопределяет суперкласс или интерфейсный метод.Это инструмент для разработчиков, помогающий поддерживать их здравомыслие, и ничего более.

В данном конкретном случае просто следует отметить, что реализация hashCode() в OvTester переопределяет метод hashCode(), определенный в Object.Это не имеет ничего общего с toString(), и вызов метода toString() суперкласса из вашего hashCode() метода не будет / не то же самое, что переопределение toString().

это правда?метод hashCode () в OvTester должен переопределить тот же метод имени в своем суперклассе?

Это действительно так, в том смысле, что аннотация заставит компилятор вызвать ошибку, если нетпереопределяемый hashCode() метод в суперклассе, который соответствует сигнатуре аннотированного метода.

0 голосов
/ 23 августа 2011

Этот код переопределяет метод hashCode() из базового класса Object.Метод toString() все еще имеет исходную реализацию.

Чтобы переопределить toString(), вы делаете следующее:

@Override
public String toString() {
    //Your own toString() implememntation here
}

Пока метод в дочернем классе имеет то жеимя и подпись как метод в родительском классе, AND метод в родительском классе NOT private, он будет переопределен (независимо от наличия аннотации @Override)

0 голосов
/ 23 августа 2011

@Override - это просто проверка времени компиляции, действительно ли разработчик переопределяет метод.

если вы попытаетесь переопределить

@Override
public void equals(Object ob){

}

не удастся скомпилировать

0 голосов
/ 23 августа 2011

Нет, это будет означать только то, что метод hashCode () переопределяется.Во время компиляции компилятор проверит, что hashCode () действительно является методом (с этой сигнатурой), который переопределяется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...