Herança!

11 respostas
E

Pessoal…sei que talvez o assunto seja bem abordado…mas já li diversos itens, pesquisei no google, mas minha dúvida esta não em como utilizar, mas em como os atributos(dados) dos objetos criados nas sub-classes são tratados…minha dúvida é assim…

se eu tenho uma super-classe exemplo Pessoa e ela tem um atributo nome quando eu extendo pra classe homem este atributo vai ser criado lá na subclasse(digo virtualmente) ou quando o nome for passado o nome vai ficar na classe pai mesmo que o objeto seja da classe homem…???não sei se me fiz entender!

agradeço!

11 Respostas

pimenta

O atributo não vai ser criado na classe Homem ele é enxergado na classe Homem.

shoko

Primeiramente isso vai depender do modificador do atributo(public, private, protected,etc) e ele não é copiado e sim é criado uma referencia aos atributos da superclasse e seus respectivos métodos.

E

Então quer dizer que a herança cria um link para aquelas caracteristicas do objeto homem???tipo quando eu inserir o nome ele vai criar o objeto homem e o nome vai ser jogado para a superclasse…mas isso não criaria um objeto na classe mãe???

S

Não sei se entendi corretamente o que você está querendo, mais ao meu ver, se você estiver se referindo ao momento da inserção dos dados (persistencia), ele apenas herda as caracteristicas da classe SUPER, sendo assim a classe HOMEM, passara a ter suas caracteristicas e dados proprios + os da classe PESSOA.

sergiotaborda

energumino:
Pessoal…sei que talvez o assunto seja bem abordado…mas já li diversos itens, pesquisei no google, mas minha dúvida esta não em como utilizar, mas em como os atributos(dados) dos objetos criados nas sub-classes são tratados…minha dúvida é assim…

se eu tenho uma super-classe exemplo Pessoa e ela tem um atributo nome quando eu extendo pra classe homem este atributo vai ser criado lá na subclasse(digo virtualmente) ou quando o nome for passado o nome vai ficar na classe pai mesmo que o objeto seja da classe homem…???não sei se me fiz entender!

A sua duvida é irrelevante para entender como usar herança. Vc está se preocupando demais com detalhes.
O que interessa saber é que se A herda B então ela tem acesso a tudo o que B deixou na herança (ou seja tudo o que não é privado)
“Ter acesso” significa que A pode ler e atribuir valores a esse atributos, invocar esses métodos e sobre-escrever os métodos que não tenham sido bloqueados.

E

sim é isso aí…agora esta ficando mais claro…então é como se o código estivesse escrito mesmo na classe homem!sendo que nada será feito na superclasse!

E

sergiotaborda:

A sua duvida é irrelevante para entender como usar herança. Vc está se preocupando demais com detalhes.
O que interessa saber é que se A herda B então ela tem acesso a tudo o que B deixou na herança (ou seja tudo o que não é privado)
“Ter acesso” significa que A pode ler e atribuir valores a esse atributos, invocar esses métodos e sobre-escrever os métodos que não tenham sido bloqueados.

:smiley: sei que é irrelevante, mas gosto de entender o funcionamento do que estou fazendo…to aprendendo e só queria entender se quando os valores são inseridos eles ficam na classe A ou se eram jogados para b, pois os atributos estão nela…mas obrigado igualmente…compreendi que os atributos herdados estão na subclasse como se estivessem na super…e que os valores informados ficam no objeto da sub!

sergiotaborda

energumino:
sergiotaborda:

A sua duvida é irrelevante para entender como usar herança. Vc está se preocupando demais com detalhes.
O que interessa saber é que se A herda B então ela tem acesso a tudo o que B deixou na herança (ou seja tudo o que não é privado)
“Ter acesso” significa que A pode ler e atribuir valores a esse atributos, invocar esses métodos e sobre-escrever os métodos que não tenham sido bloqueados.

:smiley: sei que é irrelevante, mas gosto de entender o funcionamento do que estou fazendo…to aprendendo e só queria entender se quando os valores são inseridos eles ficam na classe A ou se eram jogados para b, pois os atributos estão nela…mas obrigado igualmente…compreendi que os atributos herdados estão na subclasse como se estivessem na super…e que os valores informados ficam no objeto da sub!

Então ainda não tendeu…

O problema da sua prespectiva é o verbo “estar”. Aquilo que foi definido em B está em B e apenas em B.
Aquilo que foi definido em A , está em A e apenas em A. Se A acessa algo de B é porque A tem autorização para fazer isso. Herança é um mecanismo que lhe dá essa autorização. As coisas estão em B, nunca sairam de B, o detalhe é que A é um B.

Veja:

class B {
   int m =2;

  public int getM(){
       return m;
  }
}

class A extends B{

    int m =3;


    public int getM(){
       return m;
    }
}


// uso 

A a = new A();
System.out.print(a.getM());

Qual é o resultado ?

(sim, posso ter atributos com o mesmo nome em classes diferentes, mesmo que elas herdem uma da outra. Isso se chama Sobreamento)

E

Então quando eu tenho valor para um atributo herdado esta informação fica no objeto da classe filha mas os atributos em si estão na super?

S

A Herança vendo de forma simples… nada mais é que uma referencia que indica métodos e atributos que uma classe filha terá.
No seu caso a classe HOMEM terá tudo o que for da classe PESSOA, e mais metodos e atributos que forem proprios dela, sendo assim ela passará a ter esses metodos e atributos, podendo se necessario sobrescrever eles.
Em UML a classe PESSOA é uma classe abstrata, ela “existe” mais não armazena nada, apenas molda outras classes.

sergiotaborda

Não. Depende de qual atributo vc está mexendo.

O atributo herdado fica na classe pai. Ele nunca saiu de lá. Nunca sairá. É por isso que posso ter dois atributos com nomes iguais
no pai e no filho. O conceito é que a classe filha tem acesso ( o termo técnico é: “está no mesmo escopo de”) ao que o pai definiu, mas as coisas estão no pai.

Imagine que o pai é um conjunto de atributos e métodos. O filho é um conjunto maior que contêm o conjunto anterior.
(faça um diagrama de vern) Então, o filho tem acesso ao pai porque o pai “está dentro dele”.

No exemplo que eu dei o resultado é 3. Isto porque o atributo m é definido em A. Então o Java - muito esperto - assume que estamos nos referindo ao m de A e não ao de B. ( isso e´o sombreamento). Se eu quiser me referir ao m de B eu tenho que escrever

public int getM(){
   return super.m;
}

Esse m está na classe pai. Eu posso até usar os dois simultaneamente

public int getM(){
   return super.m - m;
} 

// ou 

public int getM(){
   return super.m - this.m;
}

então, como falei antes: O que está no pai, está sempre no pai. O que está no filho está sempre no filho. Acontece apenas que o filho pode manipular o que está nele e também o que está no pai. Mas as coisas não mudam de lugar.

O pulo do gato é que a filha É o pai. Ela obtem as coisas porque ela própria É-UM pai e não porque copia as coisas.
Este conceito de a filha É o pai não existe no mundo real e é ai que para a analogia de pais e filhos acaba e começa o conceito de herança.

Criado 2 de julho de 2008
Ultima resposta 2 de jul. de 2008
Respostas 11
Participantes 5