Как неправильный метод переопределения может быть вызван через несколько уровней наследования? - PullRequest
2 голосов
/ 02 ноября 2010

У меня следующая структура классов 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 был какой-то недостаток, влияющий на модель наследования, о нем было бы гораздо больше слышать. Не раскрывая всего проекта, я не думаю, что кто-то может сделать намного больше. Спасибо тем, кто ответил!

1 Ответ

1 голос
/ 02 ноября 2010

Я даже добавил строки отладки, чтобы доказать, что он вызывает A.clear (), что также доказывает, что все это было перекомпилировано.

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

В следующий раз убедитесь, что дата файлы / банки не в прошлом.

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