Полиморфизм - спецификатор доступа изменен в производном классе - PullRequest
1 голос
/ 06 февраля 2011

Привет, я просто хотел предпринять следующее поведение .. Я определил один и тот же метод - gg () в базовом и производном классе с разным доступом

Class Base  
{  
// some thing   
**private** Integer gg(){  
 //return something   
 }  
}

Class Derived{  
// something  
**public** Integer gg(){  
//return something  
}  
}

В моем основном методе, когда я инициализирую переменную

  Base d = new Derived()  

и попытка вызвать d.gg () говорит, что Base.gg () является приватным. Приводит ли изменение спецификатора доступа к вызовам метода к методу базового класса? Когда я изменяю спецификатор доступа gg () в базовом классе на public, он вызывает метод в производном классе так же, как и полиморфизм.

Из того, что я читал о полиморфизме, можно сделать спецификатор доступа менее строгим в производном классе, как здесь.

Ответы [ 2 ]

5 голосов
/ 06 февраля 2011

Доступ к объекту через ссылку на базовый класс означает, что вы намереваетесь получить к нему доступ через интерфейс, указанный базовым классом.Если вы объявили метод private в базовом классе, то вы не сможете получить к нему доступ через ссылку на базу!

Подумайте над абсурдом, который возникнет, если бы это было не так:

Base b;

if (some condition) {
    b = new Base();
}
else {
    b = new Derived();
}

b.ggg();  // Ok, or not?
2 голосов
/ 06 февраля 2011

В Java закрытые члены суперкласса не видны в производных классах. Из-за этого невозможно в производном классе:

  • ссылка на закрытых членов суперкласса - они есть, но вы просто не можете их получить, это внутренние детали суперкласса, которые не предназначены для использования в производных классах,
  • переопределить приватные методы .

Так что в вашем примере метод Derived.gg() не переопределяет метод Base.gg(). Derived.gg() - это просто метод с тем же именем, что и метод в Base классе, но они не имеют ничего общего. Столкновение имен также отсутствует, поскольку класс Derived не знает о методе Base.gg().

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