Перегрузка или перегрузка? - PullRequest
2 голосов
/ 31 марта 2010

Ребята, я знаю, что этот вопрос глуп, но просто чтобы убедиться:
Имея в своем классе метод:

boolean equals(Document d)
{
//do something
}

Я перегружаю этот метод, не переопределяю, верно? Я знаю, что этот или похожий вопрос будет о предстоящем эгзаме, и было бы глупо не получить очки за такую ​​простую ошибку;

Ответы [ 5 ]

9 голосов
/ 31 марта 2010

Исходя из предоставленного кода, мы не можем точно сказать , перегружаете ли вы его или переопределяете.

Вы, скорее всего, перегружаете метод equals(Object o).

class A {
   void method() {..}
}

class B extends A {
   // this is overriding
   void method() {..}
}

И

// this is overloading
class A {
   void method(boolean b) {..}
   void method(String arg) {..}
   void method(int arg) {..}
}

P.S. вы используете соглашение о скобках, которое не является общепринятым в мире Java. В Java чаще всего ставить открывающую фигурную скобку на том же.

6 голосов
/ 31 марта 2010

Вы даже не перегружены, так как другой метод называется equals. Но если вы добавите это s, вы будете перегружать equals. Хотя, если быть точным, мы говорим о перегрузке, если два (или более) метода с одинаковыми именами, но разными сигнатурами определены в одном классе . В вашем случае это сложнее, поскольку ваш equals с другой подписью частично скрывает оригинал equals. Что обычно плохо, потому что это почти всегда приводит к сложному пониманию поведения, таким образом, к тонким ошибкам. Всякий раз, когда кто-то вызывает equals в экземпляре вашего класса, в зависимости от типа параметра вызов может переходить к другой реализации метода.

class Document {
  public boolean equals(Document d)
  {
    //do something
  }
}

Document doc1 = new Document();
Document doc2 = new Document();
String string = new String();

doc1.equals(doc2); // calls Document.equals
doc1.equals(string); // calls Object.equals!

Вы бы переопределили Object.equals, если бы вы определили ваш метод с точно такой же сигнатурой, что и оригинал, т.е.

public boolean equals(Object obj) ...

В этом случае оба вышеуказанных вызова equals правильно выполняются Document.equals.

1 голос
/ 31 марта 2010

Из кода, который вы разместили, это может быть либо. Если equal определен в суперклассе с теми же объявлениями параметров, то вы переопределяете его. Если метод с именем equal уже существует, но с другими типами параметров, вы перегружаете его.

0 голосов
/ 02 апреля 2010

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

Class A {

    bool Equals(Document d) {...} 

    bool Equals(A a) {...} // overloaded method
}

Class B extends A {
    bool Equals(Document d) {...} // overridden method

    bool Equals(B b) {...} // overloaded method
}

Стоит отметить, что тип возвращаемого значения не имеет значения, его значение имеют имя метода и список параметров.

0 голосов
/ 31 марта 2010

В связанной заметке, если вы используете Java 5 и выше, и вы намерены переопределить, настоятельно рекомендуется использовать аннотацию @Override перед определением метода, чтобы указать ваше намерение. Неправильное использование этой аннотации (т. Е. Когда вы хотите переопределить, но не делаете этого), будет означать ошибку компиляции.

Начиная с Java 6, вы можете использовать аннотацию @Override при определении методов, которые объявил в интерфейсе класс в реализации.

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