У меня следующая структура классов Java. (JDK 1.6.0_21)
Class C extends B` {
//Nothing relevant
}
Class B extends A {
public void clear() {
// whatever
}
}
Class A {
public void clear() {
// whatever
}
}
У меня был объект c типа C. Когда я вызывал c.clear()
, он вызывал метод clear()
из класса A
, а не из класса B
. После нескольких чисток и сборок он начал использовать метод clear для класса B
, как и ожидалось.
Прежде чем кто-либо скажет: "Вы не должны перестраиваться после смены класса A, B или C". Эти занятия не изменились за 3 года. Я даже добавил строки отладки, чтобы доказать, что он вызывает A.clear()
, что также доказывает, что все это было перекомпилировано.
Кто-нибудь знает, по какой причине он звонил бы A.clear()
вместо B.clear()
, помня, что все эти три класса не изменились за годы?
РЕДАКТИРОВАТЬ: Класс A и B являются частью библиотеки, которая заканчивается в JAR-файле. Класс C
находится в приложении Java. Оба этих проекта были проверены в Eclipse и были скомпилированы несколько раз с этой проблемой - так как я добавлял отладку в библиотеку и отладку в приложении Java.
ВНОВЬ РЕДАКТИРОВАТЬ: метод clear()
в классе B
НЕ использует super.clear()
и не должен.
ЗАКЛЮЧИТЕЛЬНОЕ РЕДАКТИРОВАНИЕ: Ответ должен заключаться в том, что возникла какая-то проблема компиляции / среды - если бы в Java JDK был какой-то недостаток, влияющий на модель наследования, о нем было бы гораздо больше слышать. Не раскрывая всего проекта, я не думаю, что кто-то может сделать намного больше. Спасибо тем, кто ответил!