Короткий ответ
Нет. Переопределить можно только метод, который класс унаследовал от родителя и который наследнику виден, а private-метод виден лишь внутри своего класса и подклассам не передаётся. Метод с той же сигнатурой, объявленный в наследнике, — это новый самостоятельный метод, а аннотация @Override над ним вызовет ошибку компиляции.
Как это работает подробнее
Такое поведение называют сокрытием (hiding), а не переопределением. Аналогично ведут себя статические методы: одноимённый статический метод в наследнике лишь скрывает родительский, и какой из них вызовется, зависит от типа ссылки, а не от фактического типа объекта.
- Переопределение возможно только для унаследованных и видимых методов: не private, не static, не final.
- Аннотация @Override — компилятор проверяет, что метод действительно переопределяется; для private-метода это ошибка компиляции.
- Доступ private — метод не становится частью API наследника: для него он просто не существует.
Пример кода
Child.java
class Parent {
private void secret() {
System.out.println("private в Parent");
}
}
public class Child extends Parent {
// @Override — ошибка компиляции: private-метод не наследуется
private void secret() {
System.out.println("новый метод Child, а не переопределение");
}
}Что использовать на практике
- Переопределяй только унаследованные видимые методы и помечай их аннотацией @Override — она ловит ошибки сигнатуры.
- Чтобы скрыть реализацию от наследников, используй private или final.
- Для приватной логики, которую наследник может захотеть расширить, выбирай protected, а не private.