No livro “Certificação Java 5” do instrutor Roberto R. Serson, encontro a seguinte afirmação: “Uma subclasse não pode usar uma referência da superclasse para acessar um membro protected se estiverem em pacotes diferentes … O método clone() é declarado protected na classe Object, logo ele não pode ser invocado de códigos em outros pacotes usando referência do próprio tipo Object”.
Na prática (em termos de código) o que isso quer dizer?
Na realidade, pode sim, acho que ele quiz dizer foi que membros com visibilidade "default" não pode ser acessados por classes (sejam subclasses ou não) em outros pacotes, mas "protected" pode.
Referência eu entendo por Objeto… e relamente, mesmo sendo filho isso não rola…
eltonk
Retirado do Livro da Katty, página 35
Watch what happens if the subclass Child (outside the superclass’
package) tries to access a protected variable using a Parent class reference.
packageother;importcertification.Parent;classChildextendsParent{publicvoidtestIt(){System.out.println("x is "+x);// No problem; Child// inherits xParentp=newParent();// Can we access x using the// p reference?System.out.println("X in parent is "+p.x);// Compiler// error!}}
The compiler is more than happy to show us the problem:
%javac-d.other/Child.javaother/Child.java:9:xhasprotectedaccessincertification.ParentSystem.out.println("X in parent is "+p.x);^1error
Isso acontece porque o modificador protected comporta-se exatamente igual ao modificador default, mas com um detalhe… ele suporte herança…
O modificador default só é acessível entre classes de mesmo pacote… o modificador protected, além de acessível por classes de mesmo pacote, também é acessível pelos filhos…
[]s
W
WaocnekPJ
Que você não pode acessar um membro protected de uma classe fora do pacote desta a menos que você seja uma sub-classe, mas isto apenas funciona caso você acesse via herança, por exemplo:
Erro! Ou seja, concordo como resposta para sua pergunta com o trecho do livro da Kethy que o eltonk postou.
Waocnek
D
DeyvidDuckPJ
:eek: :oops: [size="18"][color="red"]Fiz a seguinte experiência[/color][/size]
/ClasseB
/PacoteA/ClasseA
--->Implementação da Classe ClasseA
packagePacoteA;publicclassClasseA{protectedvoidteste(){System.out.println("ClasseA");}}// fim da classeA
--->Impermentação da Classe ClasseB
importPacoteA.ClasseA;publicclassClasseBextendsClasseA{publicstaticvoidmain( String[] args ) {ClasseAcA=newClasseA(); cA.teste();}} // fim da classe ClasseB
--->Resultado da Compilação
ClasseB.java:8: teste() has protected acess in PacoteA.classeA
--> Quando troco o moficador de acesso para public ou seja:
packagePacoteA;publicclassClasseA{publicvoidteste(){System.out.println("ClasseA");}}// fim da classeA
--> O resultado sai
Classe A
No caso o Comentário do do instrutor Roberto R. Serson de que "Uma subclasse não pode usar uma referência da superclasse para acessar um membro protected se estiverem em pacotes diferentes..." tá valendo.