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.
ex.:
[code]package pacote1;
public class Classe1{
protected double somar(double a, double b){
return a+b;
}
}
package pacote2;
import pacote1.Classe1;
public class Classe2 extends Classe1{
public void metodo(){
System.out.println(super.somar(10, 20));
}
}[/code]
Isso aí funciona normalmente.
[code]package pacote1;
public class Classe1{
double somar(double a, double b){
return a+b;
}
}
package pacote2;
import pacote1.Classe1;
public class Classe2 extends Classe1{
public void metodo(){
System.out.println(super.somar(10, 20));
}
}[/code]
Watch what happens if the subclass Child (outside the superclass’
package) tries to access a protected variable using a Parent class reference.
package other;
import certification.Parent;
class Child extends Parent {
public void testIt() {
System.out.println("x is " + x); // No problem; Child
// inherits x
Parent p = new Parent(); // 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.java
other/Child.java:9: x has protected access in certification.Parent
System.out.println("X in parent is " + p.x);
^
1 error
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…
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:
package algum;
public class Classe {
protected int foo;
}
package outro;
class SubClasse extends Classe {
public SubClasse() {
foo = 3;
}
}
Tudo bem! Mas…
package qualquer;
class OutraSubClasse extends Classe {
public SubClasse() {
new Classe().foo = 3;
}
}
Erro! Ou seja, concordo como resposta para sua pergunta com o trecho do livro da Kethy que o eltonk postou.
ClasseA cA = new ClasseA();
cA.teste();
}
} // fim da classe ClasseB[/code]
—>Resultado da Compilação
ClasseB.java:8: teste() has protected acess in PacoteA.classeA
–> Quando troco o moficador de acesso para public ou seja:
[code]package PacoteA;
public class ClasseA {
public void teste() {
System.out.println( "Classe A" );
}
} // fim da classeA[/code]
–> 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.