Dúvida sobre modificador protected

Boa noite pessoal, eu fiz alguns testes e constatei um fato, que eu achei melhor perguntar para vocês antes de tirar conclusões precipitadas…
Tenho uma variável de instância com modificador protected na classe Avo no pacote ger1;

package ger1;

public class Avo {
    protected int i = 1;
}

Em seguida eu tenho a classe Pai que está em outro pacote, estende de Avo e acessa a variável i através de instância, até ai tudo normal

package ger2;

public class Pai extends Avo {
    public Pai() {
        i++
    }
}

Bom no livro diz o seguinte sobre o protected, não é possível acessar o membro i através da instância de Pai, somente através de subclasses de Pai. Mas, eu consegui acessar a variável através de instância do Pai, a unica regra é que essa classe precisa estar no mesmo pacote de Avo

package ger1;

import ger2.Pai;

public class Filho {
    public Filho() {
        Pai pai = new Pai();
        pai.i++;
    }
}

Pode isso arnaldo? oO

no caso do protected ele pode sim acessar a variável fora do pacote, se for herança. o modificador default que determina que é só dentro do mesmo pacote

Exatamente, se for por herança! Mas a classe Filho está acessando a variável por instância! Repare que a classe Pai, que está no pacote ger2 acessa a variável protected de Avo, que está no pacote ger1, por herança. Até ai sua explicação foi perfeita. Porém repare na classe Filho, ela está no pacote ger1 (mesmo do Avo) mas está acessando a variável protected através da instância de Pai que está no pacote ger2! Se eu colocar o Filho no pacote ger2, ai sim dá erro de compilação.

Se a classe Filho está dentro do pacote da Classe Avo, então ela “tem conhecimento” da existência dessa classe. Concorda?
Se ela estivesse fora, ai sim seria estranho.
Acho que essa foi a pegadinha.

[quote=ul1sses]Se a classe Filho está dentro do pacote da Classe Avo, então ela “tem conhecimento” da existência dessa classe. Concorda?
Se ela estivesse fora, ai sim seria estranho.
Acho que essa foi a pegadinha.[/quote]

Concordo, só achei estranho consegui acessar através da instância de outra classe que está em outro pacote

:stuck_out_tongue:

[quote=andreylh][quote=ul1sses]Se a classe Filho está dentro do pacote da Classe Avo, então ela “tem conhecimento” da existência dessa classe. Concorda?
Se ela estivesse fora, ai sim seria estranho.
Acho que essa foi a pegadinha.[/quote]

Concordo, só achei estranho consegui acessar através da instância de outra classe que está em outro pacote[/quote]
Acontece que o i tem visibilidade protected, portanto fica visível no mesmo pacote,
essa é uma pegadinha complicada, confesso, mas até que faz sentido.

[quote=francisco.gamarra]Pra mim isso não é uma pegadinha e sim um erro do compilador.
prodected não é por pacote, e sim por classe.[/quote]

Como erro de compilador? você sabe o que o modificador protected faz?

:stuck_out_tongue:

Então explique o erro do compilador.

[quote=francisco.gamarra]Pra mim isso não é uma pegadinha e sim um erro do compilador.[/quote]Sério mesmo?
O Java com diversos anos no mercado e um conceito básico de OO com erro não foi corrigido?

:stuck_out_tongue:

[quote=francisco.gamarra]Não não! É perfeito! Sem erros! Assim com Deus! Aliás, é tão perfeito que quase se programa sozinho. :P[/quote]É, a julgar pela sua resposta é de se imaginar que realmente você pense que seja bug.

Caras, ultimamente estão surgindo uns trolls muito sem noção aqui…

Tá na hora da moderação entrar em ação!

:lol:

A medida que você coloca as classes no mesmo pacote os membros protected ficam visíveis para acesso, sem precisar utilizar a herança.