OCPJP - Declarações e Controle de Acesso - modificador de acesso protected

2 respostas
adolfo_eloy

Pessoal,

Estou estudando o capítulo 1 : declarações e controle de acesso do livro da Kathy Sierra e Bert Bates ( guia para certificação ), e encontrei uma afirmação que acredito não ter sido muito boa no livro (Considerando encapsulamento e modificadores de acesso). Tal afirmação me deixou confuso em relação ao que pode acontecer no exame. (logo abaixo eu mostro qual foi a afirmação no livro)

Bom, seguem os códigos logo abaixo para que eu possa me expressar melhor:

Classe Parent com uma variável de instância x declarada como protected. Tudo ok até agora.

package certification; public class Parent { protected int x = 9; }

Classe Child que estende Parent que apesar de não estar no mesmo pacote que parent possui acesso ao membro x declarado como protected.
Até aí tudo normal também.

package other; import certification.Parent; public class Child extends Parent { public void testIt() { System.out.println("x is " + x); } }

Agora vem a questão:
Se eu criar uma classe Neighbor que tenta acessar o membro x ( que foi herdado por child ) através de uma referência para child em neighbor, o código não compila!
Conforme o que li no livro, tudo bem também!!! Sem problemas. (Reparem que Neighbor está no mesmo pacote que Child.

package other; public class Neighbor { public static void main(String[] args) { Child c = new Child(); System.out.println(c.x); } }

No livro, temos a declaração:
"… quando uma subclasse de fora do pacote herda um membro protect, esse membro torna-se essencialmente private dentro da subclasse…"
Até então, eu acreditei que o membro tornava-se essencialmente private.

Porém se eu mover Neighbor para o pacote de Parent da forma abaixo, o código funciona normalmente.
Ou seja, o fato de Child herdar x de Parent, não torna x essencialmente private em Child (na minha opinião).

Código que funciona:

package certification; import other.Child; public class Neighbor { public static void main(String[] args) { Child c = new Child(); System.out.println(c.x); } }

Considerando esse cenário, gostaria de saber se os mais experientes que já conhecem a prova para certificação acham que eu deva me preocupar com isso para a prova ou não.
Gostaria de saber se minha opinião também está correta, ou se interpretei mal o livro, pois pra mim x não virou private.

Obrigado.

2 Respostas

evertonsilvagomesjav

Ueh, a regra é clara, protected é visivel apenas dentro da classe, classes do mesmo pacote e por herança.

diegohsi

Exatamente, membro protected pode ser visto dentro do mesmo pacote e por herança pela primeira subclasse se tornando private.

Criado 30 de outubro de 2010
Ultima resposta 1 de nov. de 2010
Respostas 2
Participantes 3