Possível equívoco na afirmação livro certificação

4 respostas
R

Boa tarde Senhores, estou estudado para a certificação java 1.6, e comprei o livro " Certificação Sun para Programador Java 6 - Guia de Estudo - Kathy Sierra", e na página 22 do capítulo 01, onde fala sobre módificadores de acesso no tópico “Detalhes de Protected”, no final da página 21 já pulando para a 22, o livro diz:

“Depois que a subclasse de fora do pacote herda o membro protected, ele torna-se private para qualquer código de fora da subclasse, com a excessão das subclasses dessa subclasse. […] Resumo da história, quando uma subclasse de fora do pacote herda um membro protect, esse membro torna-se essencialmente private dentro da subclasse, de forma tal que apena a subclasse e as suas classes podem acessá-lo.”

Certo, ao testar a afirmação acima no eclipse, fiz o seguinte teste:

package certification;
public class Pai {
   protected void teste () {
       System.out.println("testando protected");
   }
}
package other;
import certification.Pai;

public class Filha extends Pai{
}
package otherpackage;
import other.Filha;

public class Neto extends Filha{
   public Neto () {
       teste();
   }
}

Após város testes, conclui que o método teste que foi herdado pela classe “Filha” continua sendo protected na classe filha,e pode ser herdado novamente pela classse Neto, e não private como citado pela autora do livro Kathy Sierra.
Posso estar equivocado, ou talvez tenha interpretado equivocadamente a citação da autora, gostaria que alguem opinasse a respeito se estou certo ou errado.

Agradeço desde já pela ajuda, voltarei aos estudos.

Obrigado
[]
GustavoR’Braz

4 Respostas

Trebloc

O que eu entendi por essa afirmação dela é que um membro protected é acessível por todas as subclasses, em qualquer nível que seja. Se classe A tem um método protected e é estendida por B, que é estendida por C, que é estendida por D, D ainda tem acesso àquele método protected, pois ele é repassado para as subclasses. Porém, ao afirmar que ele se torna private ao ser herdado, ela se refere a uma situação assim:

package certification;  
public class Pai {  
   protected void teste () {  
       System.out.println("testando protected");  
   }  
}

Como é definido para um membro protected, todas as classes do pacote certification e também as classes que herdem de Pai podem ter acesso ao método teste() da classe Pai.

package other;  
import certification.Pai;  
  
public class Filha extends Pai{  
}

Filha herda o método teste() de pai e pode acessá-lo. Porém, as classes do pacote other não enxergam este método. Ou seja, dentro da classe Filha, ele não mais exerce um papel protected e sim um private: só é acessível pela própria classe Filha.

package otherpackage;  
import other.Filha;  
  
public class Neto extends Filha{  
   public Neto () {  
       teste();  
   }  
}

Aqui a classe Neto herdou o método protected que lhe foi repassado de Filha a partir de Pai. Novamente, aqui o método teste() está private - não é enxergado pelas outras classes do pacote otherpackage, apenas pela própria Neto e por outras classes que venham a herdar dela.

rmendes08

Realmente, o acesso protected é bem chato de entender. Outra situação interessante seria essa:

package certification;    
public class Pai {    
   protected void teste () {    
       System.out.println("testando protected");    
   }    
}
package other;    
import certification.Pai;    
    
public class Filha extends Pai{
    void foo(){
       Pai p = new Pai();

       p.teste(); //causa erro de compilação
    }
}
ribclauport

Bom vi a questão e voltei ao livro para analisar melhor:

O texto acima mostra que para ter o efeito de private é considerado o seguinte trecho da dissertação do autor:

Veja que ele diz que a classe Neighbor do mesmo pacote tem uma “referência” a uma “intância” de Child, a palavra instância mostra bem o que ele quer dizer,
se você herdar a subclasse recai no texto em que o autor afirma o efeito protected com total acesso a variável, veja o trecho da disseração do autor:

Repare que ele diz com “exceção das subclasses dessa subclasse”, e o código que o amigo postou é justamente uma subclasse da subclasse, para realmente explanar o que o autor diz seria:

package certification;  
    public class Pai {  
       protected void teste () {  
           System.out.println("testando protected");  
       }  
    }
package other;    
import certification.Pai;    
    
public class Filha extends Pai{    
}
package other;    
    
        
    public class Neto{    
       public Neto () {  
          Filha f = new Filha(); // Isso que o autor quer dizer uma instância de f, não tem acesso pois somente dentro do codigo
                                       //da classe Filha é que se pode ter acesso ao membro, e neste caso é private o efeito que se obtem.
           f.teste();    
       }    
    }

Espero poder ter ajudado de alguma forma.

R

Senhores muito obrigado pela ajuda, a minha dúvida foi sanada, fiz mais teste e pude perceber que tive a dúvida pelo termo usado pelo autor do livro, já que ele diz que o atributo se torna private, mas na verdade ao ser herdado o membro protected, esse membro herdado não se torna private e sim um tipo diferente de protected, que caso uma nova classe extenda essa subclasse que herdou o membro protected, sim ele e repassado como herança, ENTRETANTO caso uma nova instancia da subclasse que herdou o membro essa isntancia nao poderá invocar o membro que esteja no mesmo pacote, ou seja, temos um comportamento diferente de um membro protected, diferente de um private (que nunca é passado por herança), totalmente difernete de public, e diferente do default que pode ser visto caso esteja no mesmo pacote.

Realmente o protected tem suas complicações , mas fazendo os testes, ficou mais claro.
Agradeço a todos.

Criado 25 de fevereiro de 2012
Ultima resposta 26 de fev. de 2012
Respostas 4
Participantes 4