Herança - O que será herdado e o que não será herdado?

Uma subclasse herda os atributos e métodos de sua superclasse, , porém a superclasse pode escolher quais membros serão herdados por suas subclasses usando os modificadores private, default, protected e public.

Membros public são herdados.
Membros private não são herdados.
Membros protected … ?
Membros default … ?

Minha duvida é em relação aos membros marcados com o protected e default.
No caso do protected, uma classe B estende uma classe A. A classe B só terá acesso aos membros protected da classe A se as duas estiverem no mesmo pacote?

Opa,

Com relação aos membros protected:
Subclasse tem acesso aos membros protected independente do pacote (pode estar no mesmo ou não).

O que acontece é o seguinte…
Ao criar um objeto dessa subclasse em uma outra classe qualquer dentro do mesmo pacote, vc consegue visualizar os métodos protected.
Ao criar um objeto dessa subclasse em uma classe fora do pacote, vc não conseguirá visualizar os métodos protected.
Mas de qlqr forma, a extensão rola.

Com relação aos membros default:
Subclasse tem acesso aos membros default apenas dentro do mesmo pacote.

A regra da chamada segue a do protected.

Que me lembro é isso ai…
Me corrijam se estiver errado.

Obrigado pela ajuda, abri o eclipse aqui e fui testar “na vera”.

Uma classe B que estende uma classe A, mesmo elas estando em pacotes diferentes, os membros protected são visíveis.

Esse está correto. Mesmo uma classe A estendendo a classe B, estando em pacotes diferente os membros não são visíveis.

Valeu!

Opa…

Sim…
Mas com relação ao protected, eu digo ao utilizar essa classe… entende?
A parada é meio confusa msmo.

Tipo, se vc for criar um objeto de br.com.empresa.ClasseA em br.com.empresa.projeto.ClasseB…
O objeto da ClasseB nao tera acesso aos metodos da ClasseA…

Mas extender é liberado em qlqr situação.

Entender herança não é dificil. O que é mais dificil é entender Visibilidade e Acesso.

Ora, se B herda de A, então B tem tudo o que A tem, porque B é-um A. Então, não existe esse negócio de herda/não herda. É mais simples pensar que herda tudo e pronto.

Mas agora que B herdou as coisas de A, como B acessa essas coisas ? Fazendo chamadas. Mas ele pode fazer todas as chamadas que quiser ? Não. É aqui que entram os niveis de visibilidade.

O que A declarou como private é só dela. Então, B vai herdar essas coisas, mas não as vai ver. Não terá acesso a elas. (No lingo diz-se que B não herda, mas ele herda sim, o problema é que ele não enxerga, então é com se, não herdasse).
O que A declarou como public, B tb vê. Esta é fácil.

Agora, como A pode dar permissão de visibilidade às suas clases filhas, mas a mais ninguém ? Com o protected.
O que é protected em A é visibel em B, mas para mais nínguem.

finalmente temos o escopo default. Este escopo é especial porque ele é relacionado ao pacote. O que é default em A será visivel em todas as classes do mesmo pacote, mesmo que não haja herança entre elas. (É por isto que o nivel de visibilidade é mais relevante que o conceito de herança, porque a herança é apenas um dos fatores possiveis). Então se B está no mesmo pacote que A, ele tem acesso ao que é nível default em A.

Se B está num pacote diferente de A, então apenas o que é public e protected em A será visivel a B.

É preciso entender que java trabalha com escopos , e a herança é apenas uma forma de manipular o escopos (tal como quando vc usa chaves dentro do código, o java cria um escopo novo). Os níveis de visibiliade é que realmente comandam quem vê o quê.