2015-10-09 2 views
2
//Filename: A.java 
package packageA; 
public class A { 
    protected int x; 
} 

//Filename B.java 
package packageB; 
import packageA.A; 

public class B extends A { 
    void action(A ob1, B ob2, C ob3) { 
     x = 10; 
     ob1.x = 10; // <-- error here 
     ob2.x = 10; 
     ob3.x = 10; 
    } 

public class C extends B { 
    void action(A ob1, B ob2, C ob3) { 
     x = 10; 
     ob1.x = 10; // <-- error here 
     ob2.x = 10; // <-- error here 
     ob3.x = 10; 
    } 

Итак, я читал защищенное использование в Java и наткнулся на эту проблему. A.java и B.java являются отдельными файлами и хранятся в отдельных пакетах, как вы можете видеть. При компиляции B.java я получаю 3 ОШИБКА, что x имеет защищенный доступ в A. Может кто-нибудь объяснить, почему я получаю ошибку даже после расширения класса A?Ошибка при доступе к защищенным членом

ответ

0

В способе action класса B в качестве аргумента вы получите экземпляр класса A - ob1.

ob1 сам по себе чистый класс A объект. Это не экземпляр класса B, который распространяется от класса A. Таким образом, вы не можете переопределить защищенный член класса А за пределами класса А.

Вы можете переопределить элемент поля x класса B, поскольку x протягиваются от защищаемого учащегося в x.

public class B extends A { 

    // class B has member x in field which is extended from class A 

    void action(A ob1, B ob2, C ob3) { 
     x = 10;  // <-- this is extended field member x from class A in class B 
     ob1.x = 10; // <-- this is protected member of other instance of A 
     ob2.x = 10; 
     ob3.x = 10; 
    } 
} 
+0

Спасибо, что решил. – fireboy91

1

Вам не разрешен доступ к защищенному члену через ссылку супертипа. См. Java Language Specification, section 6.6.2: Details on Protected Access.

время компиляции происходит ошибка в методе дельте здесь: он не может получить доступ к защищенным членам х и у его параметра р, потому что в то время как Point3d ( класса, в котором происходят ссылки на поля х и у) является подклассом Точка (класс, в которой объявляются x и y), она не участвует в реализации Точки (тип параметра p) . Метод delta3d может получить доступ к защищенным членам его параметра q, поскольку класс Point3d является подклассом Point и участвует в реализации Point3d.

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

  • Нет связанных вопросов^_^