Problemas com Herança!

Salve galera. Estou estudando java a algum tempo, e refazendo uma analise sobre herança de atributos de uma classe em java, fiquei com a seguinte duvida:

O encapsulamento em Java é essencial para o seu correto funcionamento, portanto devemos de evitar tornar publica uma variavel em nossa classe, expondo nossos dados. Ok!

Mas o problema esta no seguinte. Se eu tiver uma classe abstrata:

public abstract class AbstractPessoa { private int idade; // Tornar a variável privada para que se realize o encapsulamento. Não é uma boa ideia, pois assim o atributo nao sera herdado. public String nome; // Assim, o atributo é herdado, porem ele continuará a ser publico nas suas subclasses, impedindo o encapsulamento. protected String sexo; // Diminui o escopo da variável, porem impede parcialmente o encapsulamento. }

Agora, minha duvida é o seguinte, como posso herdar variáveis de uma superclasse e realizar o seu encapsulamento?

Você pode deixar a variável como private.
É uma ótima ideia, pois o atributo é herdado, só não é diretamente acessível pela classe filha.

Para torna-lo acessível nos filhos, você cria um método getter e, se for o caso, um setter com visibilidade publica, protected ou default.

Opa, obrigado pela resposta, mas me confundiu um pouco… Tem alguma razão especifica para os as variaveis privadas nao terem a possibilidade de serem acessadas diretamente dentro da classe que herdou-a?

Tinha essa mesma dúvida, se a super classe não for abstrata podem existir atributos que só digam respeito a ela.

Para ser sincero não conheço um exemplo de aplicação para esse conceito…

Sim, o fato de serem privadas. :slight_smile:
Via de regra, quanto menos detalhes de uma classe você expor, melhor. Mesmo no caso da herança, a subclasse não precisa conhecer todos os detalhes da superclasse.

Se você quer acessar da subclasse, então, precisa usar um atributo como protected ou public.

Entretanto, usamos pouca herança em sistemas de verdade. A relação mais usada costuma a ser a de composição.

[quote]Tinha essa mesma dúvida, se a super classe não for abstrata podem existir atributos que só digam respeito a ela.

Para ser sincero não conheço um exemplo de aplicação para esse conceito…[/quote]

Li sua resposta agora amigo. Nossa, nao pensei nisso, de fato. Mas faz muito sentido.

E como ja complementou o Vini:

[quote]Via de regra, quanto menos detalhes de uma classe você expor, melhor. Mesmo no caso da herança, a subclasse não precisa conhecer todos os detalhes da superclasse.
[/quote]

Muito bem esclarecido.

Valeu pelas respostas gente! Até!

fabio

só por questao para alertar os outros membros coloca o teu tópico como resolvido.

Ainda sou inciante com Java, mas dentre os livros que estou pretendendo ler entretando já dei uma olhadinha de curioso está o Effective Java o autor simplesmente trata
de herança com muito cuidado , e tem com uma das regras de ouro priorizar a utilização de composição no lugar de herança , deixando apenas para as aplicações onde o uso é relamente
indispensável.

Realmente existem muitos problemas com uso de herança ??

Herança é o tipo de ligação mais forte que existe entre dois objetos.

Alterar o pai vai implicar em revisar todos os objetos filhos.

Ainda sou inciante com Java, mas dentre os livros que estou pretendendo ler entretando já dei uma olhadinha de curioso está o Effective Java o autor simplesmente trata
de herança com muito cuidado , e tem com uma das regras de ouro priorizar a utilização de composição no lugar de herança , deixando apenas para as aplicações onde o uso é relamente
indispensável.

Realmente existem muitos problemas com uso de herança ?? [/quote]

O problema não é tecnico. É que a herença está relacionada ao que o objeto é. Se vc caracteriza errado o que o objeto é, vc destroi qualquer modelo. é um problema de taxionomia e não do java em si.
Antigamente a herança era vista apenas como reaproveitamento de codigo ( uma forma de manter o codigo DRY), mas isso se provou errado. o C++ e a sua herana multipla mostraram que isso era um conceteiro errado.
O Java olha a herança como classificação taxionomática e isso a torna especial e única. O objeto só pode ser uma coisa. Contudo ele pode comporta-se de multiplas formas (interface). Isto resolveu o problema e não ha mais o problema que tinhamos no c++.
Contudo o programador pode abusar da herança para ganhar reaproveitamento e isso ainda é um problema pois isso não depende da linguagem, depende de quem a usa.

[quote=sergiotaborda]O problema não é tecnico. É que a herença está relacionada ao que o objeto é. Se vc caracteriza errado o que o objeto é, vc destroi qualquer modelo. é um problema de taxionomia e não do java em si.
Antigamente a herança era vista apenas como reaproveitamento de codigo ( uma forma de manter o codigo DRY), mas isso se provou errado. o C++ e a sua herana multipla mostraram que isso era um conceteiro errado.
O Java olha a herança como classificação taxionomática e isso a torna especial e única. O objeto só pode ser uma coisa. Contudo ele pode comporta-se de multiplas formas (interface). Isto resolveu o problema e não ha mais o problema que tinhamos no c++.
Contudo o programador pode abusar da herança para ganhar reaproveitamento e isso ainda é um problema pois isso não depende da linguagem, depende de quem a usa.[/quote]

Cara, ta você explicou perfeitamente. Nada a acrescentar :smiley: