Согласно Oracle Tutorials
Подкласс не наследует частные члены своего родительского класса.Однако, если у суперкласса есть открытые или защищенные методы для доступа к его частным полям, они также могут использоваться подклассом.
[Вопрос] Для отношения класса как Sub extends Super
Понятно, что в документации Oracle говорится, что просто для поддержки факта "могут быть переопределены только унаследованные методы", но это своего рода вводящее в заблуждение утверждение , как будто оно подразумевает => , еслиметод не наследуется, тогда он не представлен как поведение объекта класса Sub, и если это так, то он никоим образом не может быть вызван для объекта класса Sub.Но метод в классе Super может вызывать закрытый метод, определенный в классе Super для объекта подкласса .Пожалуйста, обратитесь к пунктам ниже и к соответствующему коду и предложите, если есть какой-то пробел в моем понимании?
Я всегда понимал наследование, как ниже 3 пункта
- Класс
Sub
наследует все экземплярыметоды и поля (включая приватный). - Если метод приватный в
Super
, то он не виден в Sub
, но это не означает, что объект Sub
не имеет поведения,
Код для точек 1 и 2
public class Super{
private void privateMethod(){
System.out.println("private method defined in Super");
}
public void m(){
privateMethod();
}
}
public class Sub extends Super{
}
public void Other{
public static void main(String[] args){
Sub s = new Sub();
s.m();
}
}
Мы создали объект Sub
, m()
наследуется Sub
иего public
означает, что к нему можно получить доступ к коду вне Super
.При вызове m()
мы можем вызвать privateMethod()
.Если бы частные методы не были унаследованы, то возникло бы какое-то исключение времени выполнения, а это не так.
Overriding
применимо только к
видимым методам экземпляра только в классе
Sub
.Если метод невидим и определен в обоих классах,
Sub
и
Super
, тогда объект обладает обеими возможностями, и оба метода могут быть вызваны кодом, который может обращаться к конкретному методу (см. Код ниже)
Код для точки 3
public class Super{
private void privateMethod(){
System.out.println("private method defined in Super");
}
public void m(){
privateMethod();
}
}
public class Sub extends Super{
private void privateMethod(){
System.out.println("private method defined in Sub");
}
public void m2(){
privateMethod();
}
}
public class Other{
public static void main(String[] args){
Sub s = new Sub();
s.m(); // m() will invoke private method of Super
s.m2(); // m2() will invoke private method of Sub
}
}
Утверждение, что класс Sub
не наследует закрытый метод от Super
подразумевает, что метод не может быть вызван наобъект Sub
, поскольку поведение не наследуется, следовательно, не является частью (не принадлежит) объекта.Выше мы видим, что это не так.