Вот мой кодИспользование полиморфизма может нарушить правило защищенного модификатора доступа в Java?
Пакет
package a;
import static net.mindview.util.Print.print;
import b.B;
public class A
{
protected void f()
{
print("This is A's protected f()");
}
public static void main(String[] args)
{
// new B().f() does not work!
// compiler will complain B.f() is not visible
A a = new B();
a.f(); // but using polymorphism here! I can invoke B.f()!
}
}
Пакет б
package b;
import static net.mindview.util.Print.print;
import a.A;
public class B extends A
{
protected void f()
{
print("This is B's protected f()");
}
}
Проблема заключается в аф() в основной() на самом деле вызывает класс Б защищен переопределены е(), к какому классу A не имеет доступа.
Обратите внимание, что A является суперклассом B, и они находятся в разных пакетах. A не имеет доступа к B f().
Технически говоря, защищенный f() B может быть доступен только из его подклассов или классов в одном пакете.
Но ни одно условие удовлетворяются класс А.
Итак, мой вопрос здесь действительно полиморфизм фактически нарушают правила защищенного модификатора доступа, или есть неявный и скрытие механизм происходит во время разговора?
Может ли кто-нибудь помочь?
Большое спасибо.
Результат печати: «Это защищенный B f()».
Это совершенно другой вопрос: «Понимание защищенного Java-модификатора». Пожалуйста, внимательно ознакомьтесь с кодом !!!!
В этом вопросе C -> A отношения. в C (подкласс) создайте A a = новый A() (суперкласс) и попытайтесь получить доступ к защищенному члену, но этого не сделать.
В моем вопросе B -> A отношения. в «A» (суперкласс) создайте «B» b = новый B() (подкласс) и попытайтесь получить доступ к защищенному члену b (который не должен преуспеть), но ему это удастся!
Я думаю, что я так четко выражаю разницу, чтобы любые нетерпеливые программисты быстро различали два вопроса.
Вы просто не понимаете это правильно. Вы создали экземпляр «B». Его функция переопределяет функцию 'A', поэтому, когда вы запускаете код экземпляра, это то, что вы запускаете. Если вы не хотите, чтобы это произошло, используйте 'private', а не' protected'. – UDKOX
@UDKOX Они смущены тем, почему 'new B(). F()' не работает в пакете 'a', тогда как, казалось бы, тот же самый ((A) новый B()). F()' does. –
@UDKOX Видимо, вы вообще не поняли мой код. Возможно, вам нужно действительно внимательно изучить код, чтобы понять мой вопрос. Я понимаю защищенный модификатор без каких-либо проблем. Мой вопрос заключается не в непонимании смысла защищенных. Вы должны увидеть все фрагменты кода более тщательно. – Sai