Eu tava vendo uma coisa no livro da Kathy (arg… versão português), sobre a respeito do modificador de acesso protected, achei estranho quando ele falou que por exemplo uma variável protected ela se torna inacessível a outra classe que herda de uma quasse que herdou da superclasse que no caso é a que têm a variável protected. Isso na prática é diferente, se eu tiver uma classe com tal variável protegida e tentar acessar po uma classe que herda da classe que herdou dessa super classe, o programador aceita normalmente. Realmente há muitas coisas estranhas… :roll:
Sou eu que estou errado ou o livro?
6 Respostas
estranho, eu ja li este mesmo capitulo e não notei isso, poste o trexo do livro q a kathy fala isto…! :roll:
Bom, eu lembro quando li na versão original que era mais ou menos isso mesmo, e eu traduzi (e testei) assim no meu resumo:
- protected: acessível por classes do mesmo pacote ou através de herança. Os membros herdados não são acessíveis a outras classes fora do pacote em que foram declarados. Como o conceito de protected tem alguns detalhes que podem não ficar claros à primeira vista, veja estes exemplos:
package pai;
public class Pai{
protected int teste = 9;
}
// Teste 1:
package filho;
import pai.Pai;
public class Filho extends Pai {
public void teste() {
System.out.println(teste); // OK, usa a variável herdada
Pai p = new Pai();
System.out.println(p.teste); // ERRO: teste has protected access in pai.Pai
}
}
// Teste 2:
package filho; // Funcionaria se o package fosse o pai
public class Cunhado{
void teste(){
Filho filho = new Filho();
System.out.println(filho.teste); // ERRO: teste has protected access in pai.Pai
}
}
Provavelmente no seu caso aceitou normalmente porque estava no mesmo pacote, e protected tem visibilidade maior que aquela default (sem modificador nenhum). Inclusive, essa ordem de visibilidade dos modificadores costuma cair na prova, então é bom prestar atenção.
Opa bani!
O problema que eu achei estranho foi o seguinte, vou da como exemplo o exemplo que você criou
// Teste 2:
package filho; // Funcionaria se o package fosse o pai
public class Cunhado{
void teste(){
Filho filho = new Filho();
System.out.println(filho.teste); // ERRO: teste has protected access in pai.Pai
}
}
Nessa terceira classe do pacote externo, você tentou criar por instância da classe, isso no caso como você bem disse é errado, agora o que acho estranho é assim:
// Teste 2:
// classe alterada
package filho; // Funcionaria se o package fosse o pai
public class Cunhado extends Filho{
void Cunhado(){
System.out.println(teste); // CERTO. Agora funcionou
}
}
Achei estranho assim, ou seja o construtor chama a variável de instância teste que está na classe Pai que é de outro pacote. Pensei que os membros ficariam como privado ou default, já que a classe Cunhado herda de Filhos e não de Pai, pensei que os membros ficariam invisíveis nesse caso aqui.
No caso de herança funciona infinitamente. O problema é só acessar de fora se não for por herança.
Nem isso o livro da Kathy falou, a respeito do protected, valeu Bani!