Dúvida - Herança e private

13 respostas
PaduaAlves

Pessoal, sempre li que tipos private não podem ser herdados. Isso sempre me gerou grande dúvida, pq afinal, se tipo private não podem ser herdados, qual o sentido de termos atributos private em uma classe mãe, sendo que o filho não receberá nenhum desses atributos? Outra dúvida minha é a seguite. Tenho 3 classes. Funcionário, Gerente e Teste. Seguem as classes abaixo

public class Funcionario {

private String setor;
private String salario;

public String getSetor() {
return setor;
}

public void setSetor(String setor) {
this.setor = setor;
}

public String getSalario() {
return salario;
}

public void setSalario(String salario) {
this.salario = salario;
}

}
-----------------------------------------------
public class Gerente extends Funcionario {

}

----------------------------------------------------

public class Teste {

public static void main(String[] args) {
Gerente gerente = new Gerente();
gerente.setSalario("100");
System.out.println("O salario é " + gerente.getSalario());
}

}

A saída desse código, como vcs devem saber é "O salário é 100".

Ai vem minha duvida, se o atributo salário é private em Funcionario, quer dizer que Gerente não o herdou, porém herdou os métodos getSalario() e setSalario(String salario), pois ambos são públivos. Como um objeto da classe gerente pode dar um get e um set na propriedade salario se ela não é definida na classe? Isso deveria gerar um erro de compilação já que Gerente não tem atributo nenhum. Agradeço a ajuda.

13 Respostas

rmendes08

Veja bem, na prática, quando o objeto é criado na memória são criados também os campos da superclasse. Eles apenas não são acessíveis diretamente pelas subclasses. Se não houvesse maneira de ocultar membros das subclasses isso seria a mesma coisa que não ocultar, pois bastaria estender uma classe para arrebentar com sua implementação.

PaduaAlves

Valeu, orbigado pela resposta!

ctosin

Olá,

Reforçando o que o rmendes08 escreveu, é muito importante que haja uma forma de proteger os atributos de todas as outras classes, inclusive as subclasses. Em orientação a objetos existe o conceito de encapsulamento, que consiste em esconder detalhes de implementação da classe. Se você permite acesso direto aos atributos da superclasse por uma subclasse vai ficar bastante complicado de você alterar depois o funcionamento da sua superclasse caso seja necessário, já que é provável que você tenha que alterar o código das subclasses também.

Se você realmente precisa acessar os atributos na subclasse, você pode declará-los como protected. Mas cuidado e não se esqueça que, ao fazer isso, outras classes do mesmo pacote terão acesso aos atributos, mesmo que elas não sejam subclasses.

Abraço!

evertonsilvagomesjav

protected tem acesso fora do pacote tambem com herança.

ViniGodoy

Nunca entendi pq o Java é tão permissivo em relação à pacotes. Na minha opinião, seria muito melhor que protected restringisse somente as subclasses e o default a todos do mesmo pacote.

rmendes08

Nunca entendi pq o Java é tão permissivo em relação à pacotes. Na minha opinião, seria muito melhor que protected restringisse somente as subclasses e o default a todos do mesmo pacote.

Também concordo Vini.

Bem, só pra complementar a discussão, também não é recomendado usar protected para expor campos para subclasses. A função do protected é oferecer um meio de fornecer interfaces distintas para classes que usarão a classe e classes que estenderão a classe original. Assim, em uma situação ideal, campos devem ser sempre private, métodos que podem ser usados/sobrescritos por subclasses, protected e o resto public.

PaduaAlves

O que faltava a mim, era saber que um objeto sempre possui todas as características do objeto mãe, apesar de não poder acessa-las. No caso do meu exemplo, gerente sempre terá no mínimo tudo o que um funcionário tem, pois gerente É UM funcionário. Acho que confundi o fato de um objeto ter algo com o de poder acessar algo. Vejo agora que são coisas distintas. Me ajudaram muito. Mais uma vez obrigado.

rmendes08

Opa! É isso mesmo, entendeu direitinho.

Trebloc

Sempre que o método construtor de um objeto é chamado, ele também invoca o construtor da superclasse, que também invoca o da sua superclasse, até chegar à classe Object.

Quando você faz

Funcionario a = new Funcionario(); System.out.println(a.toString());

É como se o seu objeto invocasse o toString do seu “pai” Object, uma vez que a herança funciona como se apenas fosse dada permissão para que o filho acessasse os métodos do pai, mas sem tê-los dentro de si necessariamente.

Mas pra facilitar, dizemos que na herança a classe herda todos os membros visíveis da classe-pai para si, inclusive os campos (membros visíveis = tudo que não for privado).

alexvingg

Eu acho que você declarando private e utilizando os metodos get e set seu codigo fica mais organizado
para vc entender e para quem for fazer a manutenção dele !

ctosin

Concordo em gênero, número e grau :wink: Sempre me perguntei o porquê disso e acho que poderia ser mais simples mesmo…

Abraço

LPJava

pense no seguinte:

private: a cueca do seu pai,vc nunca vai querer herda-la, é algo que so pertence a ele.

agora

herança: vc vai querer herdar os patrimonios que seu pai tem.

Entao quando falar em herança pense em algo comum para as duas classes, porem quando for private é algo bem especifico da classe. Por exemplo o seu salario nao pode ser public, aposto que o programador que trabalha do seu lado ele nao vai gostar de saber que vc ganha mais que ele e ambos no mesmo nivel seguindo a hierarquia da empresa(por isso vc deixa seu salario como private). Mas, o pessoal do RH sabe seu salario e quando vc receber um aumento, alguem do setor pessoal, vai alterar seu salario via setSalario(double salario).

uahu nao sei se ajudou, mas tem que abstrair a coisa. Quando comecei saia do mundo tecnico e ia relacionando como usuario no mundo para fixar os conceitos. Depender do livro, apostila que estiver lendo, pode deixar vc confuso, pq nem todos autores sao bons para ensinar de forma clara e simples.

flw!

pedroroxd

ViniGodoy:

Nunca entendi pq o Java é tão permissivo em relação à pacotes. Na minha opinião, seria muito melhor que protected restringisse somente as subclasses e o default a todos do mesmo pacote.

Então não é só eu que penso assim! =)

Criado 13 de março de 2010
Ultima resposta 14 de mar. de 2010
Respostas 13
Participantes 9