2010-03-31 2 views
2

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

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

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

ответ

6

Вы даже не перегружаетесь, так как другой метод называется 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.

9

На основании предоставленного кода мы не можем сообщить , перегружаете ли вы его или переопределяете.

Вы, скорее всего, перегрузка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 чаще встречается открытие фигурных скобок.

1

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

0

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

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

-1

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

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

@Tyanna «Перегрузка: то же имя метода, тот же список параметров, разные классы Переопределение: одно и то же имя mehtod, список параметров, одинаковые или разные классы». - Это не так. –

+0

Так жаль. Я вернул их назад. – Tyanna

Смежные вопросы