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…?
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).
É 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?
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.