Я не понимаю, почему # 1 неверно
Потому что:
Object::equals
определяется как public boolean equals(Object)
, и
public boolean equals(SomeType)
не отменяет public boolean equals(Object)
. На самом деле это перегрузка, а не переопределение. Это разные операции.
Не могут подклассы получить доступ к закрытым полям суперкласса?
В общем, нет. Проверьте свои записи лекций.
Есть несколько исключений, которые связаны с объявлением подкласса внутри суперкласса.
Технически ответ № 5 верен только наполовину.
Это правильно, что подкласс не может получить доступ к закрытым полям в суперклассе, если мы остаемся в пределах чистого Java. Правила доступа Java запрещают это. (Но см. Выше.)
Верно, что вызов super.equals(other)
может быть решением. И действительно, обычно это правильное решение.
Неверно предполагать, что вызов super.equals(other)
- единственное решение.
Другие возможные решения могут включать:
- игнорирование полей суперкласса при проверке равенства,
- доступ к закрытые поля суперкласса с использованием publi c геттеров ... если они существуют, или
- доступа к закрытым полям с помощью отражения, нарушающего абстракцию.
Из альтернатив первый один редко применяется, а третий - действительно плохая идея. Но эти альтернативы означают, что ответ № 5 (как написано) технически неверен.