Modificador protected

1. package testpkg.p1;
2. public class ParentUtil {
3. public int x = 420;
4. protected int doStuff() { return x; }
5. }
1. package testpkg.p2;
2. import testpkg.p1.ParentUtil;
3. public class ChildUtil extends ParentUtil {
4. public static void main(String [] args) {
5. new ChildUtil().callStuff();
6. }
7. void callStuff() {
8. System.out.print("this " + this.doStuff() );
9. ParentUtil p = new ParentUtil();
10. System.out.print(" parent " + p.doStuff() );
11. }
12. }

Pessoal,nesse código o livro da Kate diz que somente rodará se eu remover a linha 10, pois doStuff não é visivel para ele mesmo pois ele esta em outro pacote.
Mas…a duvida fica por conta do seguinte, o modificador de acesso também limita o acesso da PROPRIA classe em relacao a seus atributos e métodos…?

Antônio, ela está correta, explico o porque:

O protected permite acesso apenas ao método ATRAVÉS da herança ou por estar no mesmo pacote.

No caso da linha 8 isso acontece, pois, ele está chamando o método através da HERANÇA.

Mas o que acontece na linha 10 é que você está chamando o método através de uma instância, o que não é válido, já que o modificador é protected (se fosse public rolaria).

Sacou a diferença?

É isso.
Eu entendi o porque rodar,da mesma forma que eu não poderia chamar um método private de fora da classe.
Eu só poderia usar via herança ou no mesmo pacote.
Mas…assim,a outra classe não é filha?
Então teoricamente,eu estaria dentro da herança,ou conceitualmente estou errado?

assim vc ta acessando os dados de uma class em um pacote diferente através da herança… o protected eu acho ele meio louco heheh!

Mas teoricamente eu sou parente de mim mesmo,entao ,eu tenho acesso a minhas coisas.

po massa os exemplos ai hehe… agor deu para sacar… mais um pirulito uhauhauh!! :smiley: boa essa

Então seufagner com isso você quis dizer que conceitualmente estou equivocado pois somente os filhos e as classes do mesmo pacote ou minha classe dentro dela mesma tem acesso ao método,mesmo que ela seja dona,somente pode acessar filhos e classes do mesmo pacote,pois eu não sou filho de mim mesmo…(profundo)
ehehe
valeus velhinho

Vou mastigar:
Na linha 10, na classe ChildUtil, que se encontra dentro do package testpkg.p2, foi criado uma instância “objeto p” do tipo ParentUtil (que é uma classe pública, podendo por isso ser referenciada por qualquer classe do projeto).
O problema foi que o “objeto p” foi instanciado em uma classe que se encontra em um pacote diferente da classe responsável pelo seu tipo, a ParentUtil.
Quando é chamado os métodos do objeto p (através de “p.” ) não aparecerá o método doStuff que é protected, por isso não visível a classes de outros pacotes, a não ser se for por herança.
Agora preste atenção:
A classe ChildUtil herda a classe ParentUtil mas o “objeto p” NÃO TEM NADA A VER COM A HERANÇA!!! Sua invocação foi possivel simplesmente pq a classe ParentUtil é PUBLICA, sendo usado para instancia-lo o constructor de ParentUtil.
Já no caso da linha 8 é diferente. A herança foi realmente utilizada. O método doStuff foi acessado por um objeto da classe ChildUtil, referenciado pelo “this.”, cujo construtor é referente a classe ChildUtil, e a partir de então é sabido que o objeto local irá herdar TODOS os métodos e campos public ou protected da superclasse, no caso a ParentUtil.

Espero ter ajudado!
T+

É ainda existe comida mastigada…
Velho…Show de bola sua resposta!!!
VAleus

voce é dono das suas coisas, mas não das coisas de ParentUtil que ele protegeu, guardou numa caixa acessível apenas a seus filhos…

coisas de família…

é como se seu pai (ParentUtil) não quisesse que você pegasse o pirulito diretamente, comer muito doce faz mal… Então ele protege e te diz:

Meu filho, quer pirulito? Então peça pra mim pegar… Você diretamente não

pronto.