Duvida sobre construtor

Pessoal,

Com esse exemplo do livro da kathy, voltei a ver um trecho de codigo q nao tenho claro o q ocorre:

class Horse extends Animal{
  void buck() { }
}
class Animal {
  void eat() { }
}
class Test {
  public static void main (String[] args) {
    Animal h = new Horse();  //minha duvida eh aqui
    h.eat(); // Legal, class Animal has an eat() method
    h.buck(); // Not legal! Class Animal doesn?t have buck()
  }
}

quando escrevemos:

Animal h = new Horse()

estamos criando uma instancia de Animal ou de Horse…quem puder explicar esse trecho eu agradeco!!

Valeu!!!

Cria uma instância de Horse, mas a variável é uma referência pro tipo Animal.

Isso serve para usar o polimorfismo, como você verá adiante :grin:

A classe Horse extende a classe Animal, assim ela herda o comportamento da Classe Animal, de uma forma indereta vc têm acesso ao membros da classe Animal. deu para entender ??

o objeto criado na memória é um Horse, mas como Animal é PAI ou
SUPERCLASS de Horse você pode atribuir esse objeto Horse a um Animal,
Pensando em objeto, você pode dizer que Horse é um Animal, logo
você pode atribuir essa referencia criada do objeto a um Animal.

Assim, você vai disponibilizar nesse caso somente dos métodos que
Animale possui, que é só eat(), mas você tem a vantagem de quando
chamar eat, ele ser executado da maneira especifica de Horse, isso
caso você tenha sobreescrito/overriden eat().

Tomare q naum tenha complicado :roll:

vc ja entendeu marceloedrei?

veja q questão interessante pra vc pensar, por favor resista a tentação de compilar:

Qual o resultado da tentativa de compilar e executar o seguinte programa :?:

class Base {

  int i;
  Base() { add(1); }
  void add(int v) { i += v; }
  void print() { System.out.println(i); }

}
class Extension extends Base {

  Extension() { add(2); }
  void add(int v) { i += v*2; }
}

[code]
public class Teste {

public static void main(String args[]) {
bogo(new Extension());
}

static void bogo(Base b) {
b.add(8);
b.print();
}
}
[/code][/b]

seria 13 :?:

:oops: nao …

:oops: nao …[/quote]

n, mas obrigado por n compilar, heheheh, explique pq achas q seria 13!

:oops: nao …[/quote]

n, mas obrigado por n compilar, heheheh, explique pq achas q seria 13![/quote]

Bem , eu rodei aqui the flash na cabeca .ehehehe … e naum raciocionei direito … é por isso que essas questoes a gente tem q dar uma atencao maior…

na verdade ele sempre vai chamar o metodo add da classe q houve a instancia…

agora se o metodo add fosse estatico a situacao ja mudaria…

se na super o add fosse static ele n poderia ser overhidden né? o q faria com q o construtor da super chama-se o add dela mesma (super) e n o da sub, pois nesse caso n haveria poliformismo, certo?

Pessoal,

Obrigado pelas dicas nao respondi nada antes…porq nao recebi os avisos de repostas…chegou um agora pouco…entao pelo q vcs explicaram consegui, espero, entender vou fazer alguns testes pra ver isso na pratica…ate mais!!!

Valeu!!!

o resultado seria 12?

:lol: n, o resultado n é 12 malanquini :roll:

22, a saída
mesmo quando está sendo construído os construtores pais, o método que foi sobreescrito será chamado, no caso o método da classe filha…
se ambos fosse static e a variavel i fosse estatica tb … o metodo que será chamado vai ser o da classe em execucao …

[quote=“fmartins”]22, a saída
mesmo quando está sendo construído os construtores pais, o método que foi sobreescrito será chamado, no caso o método da classe filha…
se ambos fosse static e a variavel i fosse estatica tb … o metodo que será chamado vai ser o da classe em execucao …[/quote]

Queria ter um filho assim :lol: CERTISSIMO