Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > Переопределение метода


Автор: Merhaba 24.5.2011, 21:09
Добрый Вечер!!!
Объясните Пожалуйста поподробнее, что обозначет: "переопределение метода" . Приведите Пожалуйста пример! Как связана аннатация @Override  с этим понятием? 

Автор: Samotnik 24.5.2011, 22:58
http://ru.wikipedia.org/wiki/%D0%9F%D0%B5%D1%80%D0%B5%D0%BE%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%B0

Автор: danilych 24.5.2011, 23:13
С переопределением метода все очень просто. Как известно, все классы в Java являются потомками класса Object, в котором присутствуют некоторые методы. Одним из таких является метод equals(). На его примере и можно объяснить, что такое "переопределение метода" и для чего используется директива @override. Этот метод используется для сравнения объектов одного класса между собой. В классе Object он реализован таким образом, что проверяет, указывают ли две ссылки на один и тот же объект в памяти. Но очень часто возникает необходимость сравнивать "содержимое" двух объектов между собой, например, пусть у нас есть класс Employee

Код

public class Employee{
  private String name;
  private String gender;
}


и мы имеем два экземпляра этого класса - A и B.
Код

Employee A = new Employee("Tom", "M");
Employee B = new Employee("Tom", "M");

Очевидно, что объекты A и B будут равны если содержат одинаковые значения в полях name и gender. Однако, если мы применим для сравнения их между собой метод equals с реализацией по умолчанию (т.е. из класса Object), то получим отрицательный результат, т.к. переменные A и B указывают на разные области памяти - 
Код

A.equals(B) даст false


поэтому, чтобы все работало нужным нам образом нужно переопределить метод equals() и реализовать в нем сравнение не ссылок, а содержимое полей name и gender.

В классе Object метод equals объявлен следующим образом:
Код

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

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

public boolean equals(Employee otherObject){
...
}

т.е. указать тип принимаемого параметра как Employee, но это уже будет не переопределение метода, а объявление нового (см. перегрузка методов). Вот тут и вступает в действие директива @override. Если помечать ей каждый переопределяемый метод, то компилятор будет отслеживать эти вопросы. Т.е. если мы сделаем так:
Код

@override
public boolean equals(Employee otherObject){
...
}

то получим сообщение об ошибке, т.к. метода equals, принимающего параметр типа Employee нет в родительском классе. 
Об этом можно почитать в книге Хорстмана Java2 Том 1. Основы 7 издание стр. 214

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)