Como vai pessoal?
Estava eu começando a ler o Guia de Estudo SCJP para Java 5 da Kathy Sierra. Bem no começo, quando se fala sobre os modificadores de acesso, o texto diz que membros protected só podem ser acessados fora de seu pacote por meio de herança. Até aí tudo bem. Mais na frente, é dito que se alguma outra classe tentar acessar o mesmo membro protected com uma referência da classe que o herdou, um erro de compilação seria gerado, pois o membro depois de herdado se tornara private. Aí é que está minha dúvida. Não acho que o membro se torna private, nesse caso, ao ser herdado, pois, se criarmos uma classe que herda da classe que herdou o membro protected, também conseguiremos acessar esse membro, como se ele continuasse protected. Caso ele se transformasse em private depois da primeira herança, ele não seria herdado na segunda. Estou certo? Fiz meus testes usando Java 6. Será um diferença de especificação ou o livro passou uma informação incorreta?
Controle de Acesso
4 Respostas
O livro diz q a classe se comporta como private caso vc tente acessá-la através um classe fora do pacote q não seja subclasse de alguma das duas.
Mais ou menos assim, se A tem um método protected e uma classe B (fora do pacote) extends A, então esse método protected vai ser enxergado pela classe B.
Agora, se vc tem uma classe C fora do pacote q não extend nem A nem B, e tente acessar este método protected em B, vc não terá acesso ao método (como se ele tivesse se tornado private de B), exceto se vc extender uma dessas classes.
Isso eu entendi. é como se o membro protected, momentaneamente, ficasse private caso a classe C tentasse acessá-lo. Mas o fato é: efetivamente o membro continua sendo protected, visto que se a classe C quisesse acessá-lo, teria que extender o classe B, correto? pois mesmo extendendo a classe B, a classe C não teria acesso se o membro protected se tornasse private. Dessa forma, essa “transformação” é temporária, para impedir que outra classe, qua não pertença à hierarquia, tenha acesso ao membro.
Pois então mfiuzajunior, é como eu disse: Se a classe C extendesse B, ela iria enxergar o método. Quer dizer q ele SE COMPORTA como private, ele não se torna um, pois a regra é q um método protected só pode ser acessado fora do pacote da classe, através de HERANÇA.
Enfim, ele não vai deixar de ser um protected, apenas por se comportar assim.
Ja foi debatido isso antes, de uma olhada neste link http://www.guj.com.br/posts/list/8060.java