2011-02-06 4 views
1

Привет Я просто хотел undertand следующее поведение .. я определил один и тот же метод - Гг() в базе и производный класс с различным доступомПолиморфизм - спецификатор доступа изменены в производном классе

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() в базовом классе на общедоступный, он вызывает метод в классе Derived так же, как и полиморфизм.

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

ответ

5

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

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

Base b; 

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

b.ggg(); // Ok, or not? 
+0

В объекте d в моем сообщении хранится ссылка на право производного класса? так и тип переменной определяет доступ для метода, а не фактический объект, на который он ссылается ?. – dasman

+0

Хорошо, теперь я понимаю. Благодарю. – dasman

+0

@user: Да, это точка полиморфизма! –

2

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

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

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

+0

Не то, чтобы они не были унаследованы *, это просто, что они не * видны * из производного класса. –

+0

@ Oli Charlesworth, вы правы. Я не был конкретным enoguht - я изменил свою формулировку. – Piotr

Смежные вопросы