2013-05-13 2 views
3
public class Superclass { 

    void method(Object a){ 
    } 
} 


public class Subclass extends Superclass { 

    void method(String a){ 
    } 
} 

В классе выше метод Superclass имеет параметр типа Object, в то время как Subclass имеет параметр типа String. Строка - это подкласс объекта. Мой вопрос в том, что метод в этом случае переоценивается?Методы переопределены, когда методы имеют одно и то же имя, но разные подписи?

+1

Java 6 имеет аннотацию Override, чтобы сделать ссылку явной. Если вы поместите (at) Override в подкласс, он скажет, что он не был переопределен. –

ответ

4

Самый известный пример путаницы, вызванной вопросом поднимаешь включает equals:

public class Banana { 
    private final double weight; 
    public boolean equals(Banana that) { return this.weight == that.weight; } 
} 

Многие люди думают, что это достоверный переопределение equals, но это на самом деле просто другой метод, не связанный с Object#equals(Object) и не будет участвовать в сравнительном сравнении.

Это одна из известных ловушек системы типов Java, поэтому будьте осторожны, чтобы все исправить.

Чтобы запутать дело дальше, вы являетесь разрешено специализироваться типа возвращаемого (типа возвращаемого значения ковариантен):

public abstract class FruitTree { 
    public abstract Object getFruit(); 
} 
public class BananaTree { 
    ... 
    @Override public Banana getFruit() { return this.bananas.iterator().next(); } 
} 

Обратите внимание, что понятие сигнатуры методы не включает возвращение тип. Подпись метода является ключевой концепцией в механизме разрешения метода статического (компиляции) времени, и каждая подпись является отдельной точкой диспетчеризации динамических методов.

7

Нет, его метод перегрузки. Для этого метод, переопределяющий сигнатуру метода метода суперкласса и подкласса, должен быть таким же. Пройдите через this блоге, чтобы узнать об этих двух, и их разница в деталях

+1

+1 Это общий источник путаницы для людей, которые пишут 'boolean equals (MyClass o);' –

+2

Возможно, стоит отметить, что вы однако, можно переопределить с более конкретным типом возврата. Конечно, дженерики тоже делают все это интересным. –

+0

@PeterLawrey да, я видел, как многие делают эту ошибку довольно много раз. – codeMan