2016-05-18 2 views
-1

Вот мой кодИспользование полиморфизма может нарушить правило защищенного модификатора доступа в 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 (который не должен преуспеть), но ему это удастся!

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

+0

Вы просто не понимаете это правильно. Вы создали экземпляр «B». Его функция переопределяет функцию 'A', поэтому, когда вы запускаете код экземпляра, это то, что вы запускаете. Если вы не хотите, чтобы это произошло, используйте 'private', а не' protected'. – UDKOX

+1

@UDKOX Они смущены тем, почему 'new B(). F()' не работает в пакете 'a', тогда как, казалось бы, тот же самый ((A) новый B()). F()' does. –

+0

@UDKOX Видимо, вы вообще не поняли мой код. Возможно, вам нужно действительно внимательно изучить код, чтобы понять мой вопрос. Я понимаю защищенный модификатор без каких-либо проблем. Мой вопрос заключается не в непонимании смысла защищенных. Вы должны увидеть все фрагменты кода более тщательно. – Sai

ответ

1

Проблема: a.f() в main() фактически вызывает защищенный переопределенный класс f(), который класс A не имеет доступа.

Неверно. Класс A имеет доступ ко всем своим членам и их переопределениям.

Обратите внимание, что A является суперклассом B, и они находятся в разных упаковках. A не имеет доступа к B f().

Вы все это говорите, но это все еще неправильно.

Технически говоря, защищенный f() B может быть доступен только из его подклассов или классов в одном пакете.

Неверно.

Но ни одно условие удовлетворяется класса А.

Они не должны быть удовлетворены, как вы только что сделали их.

Итак, мой вопрос здесь действительно полиморфизм фактически нарушает правила модификатора защищенного доступа

No. Вы правило неправильно.

или существует ли какой-либо скрытый и скрытый механизм во время разговора?

Существует приверженность к JLS #6.6.2.1, что вы, очевидно, не читали, и который говорит:

доступ разрешается тогда и только тогда, когда тип Х S или подкласс S.

Вы продолжали:

это совершенно другой вопрос от Understanding java's protected modifier.

Это немного другой вопрос с тем же ответом. Это же правило применяется. JLS # 6.6.2.1.

В частности, в вашем случае S является A, E подразумеваемая this и this имеет тип B, который является подклассом A. QED

+0

Я думаю, что у нас обоих есть некоторые недоразумения. Я внимательно изучил JLS # 6.6.2.1. Это просто указывает, как защищена работа. Мой вопрос не в том, как работает защита. Я знаю, почему новый B.f() не работает. Я хочу знать, почему полиморфизм приводит к тому, что f() B может быть вызван в A. – Sai

+0

@Sai. Ваш 'a' является экземпляром' B', а в Java, когда у вас есть экземпляр класса, вы вызываете методы этого класса (в данном случае 'B'). Я имею в виду, что это целая * точка * виртуальных методов. – hyde

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