Четыре пункта:
(1) Чтобы уточнить, что написал vivyzer, код компилируется, потому что основной метод в BaseClass имеет доступ к собственным закрытым методам класса.Если вы написали код как:
class BaseClass {
private void f() { }
}
class DerivedClass {
public void f() { }
}
class Bystander {
public static void main() {
BaseClass inst = new DerivedClass();
inst.f();
}
}
, тогда код не будет компилироваться.
(2) Это разрешено языком для поддержки сценария использования, когда автор базового класса можетдобавьте новый приватный метод, не беспокоясь о производных типах других авторов.
(3) Вы не увидите этого, если метод не был приватным.Если бы базовый класс f () имел пакет или защищенную видимость, то этот метод был бы виртуальным методом.
(4) Java не поддерживает обратную сторону пункта # 2.В частности, если у производного класса есть закрытый метод, а новая версия базового типа вводит не приватный метод с той же сигнатурой, производный класс и новый базовый класс нельзя использовать вместе.Существуют и другие языки (например, C #), которые более полно решают эти виды модульных вопросов разработки поколений.Если вас интересует этот аспект, прочитайте Artima: Управление версиями, Виртуальный и Переопределение