Dúvida básica sobre OO

Pessoal,

Estou relembrando tudo que já vi de Java com o intuito de fazer as provas de certificação.
Acho que estou um pouco enrolado na OO.

Vou usar um exemplo de classe que vi em um outro tópico aqui.

Eu tenho uma superclasse Animal e uma subclasse Ave.

O que significa executar a seguinte linha de código?

Animal animal1 = new Ave();

Eu estou criando uma referência para um objeto do tipo Animal, mas executando o construtor da subclasse? Ou a referência criada é do tipo Ave para um objeto do tipo Animal?

O seguinte código também é válido?

Ave animal1 = new Animal();

Obrigado pela ajuda.

Ps.: Desculpem pelo título, mas realmente não consegui escrever o problema de uma forma simplificada.

[quote=rvlira]
O que significa executar a seguinte linha de código?

Animal animal1 = new Ave();

Eu estou criando uma referência para um objeto do tipo Animal, mas executando o construtor da subclasse? Ou a referência criada é do tipo Ave para um objeto do tipo Animal?[/quote]

Você está instanciando um objeto do tipo Ave e o atribuindo a um referencia do tipo Animal.

[quote=rvlira]
O seguinte código também é válido?

Ave animal1 = new Animal();

Não é válido, por que nem todo Animal é uma Ave.

Como é possível instanciar um objeto do tipo Ave em uma referencia do tipo Animal? Dessa forma só estarão disponíveis os métodos e atributos da superclasse, não?

Em caso positivo, existe algum motivo para se instanciar um objeto de uma subclasse em referência do tipo da superclasse? Porque pelo que me parece não teria nenhuma função faer isso já que de fato o conteúdo da variável será da superclasse e não da subclasse, não é?

Só por curiosidade: Isso geraria um erro durante a compilação ou execução? Onde estou agora não tenho como testar para ver.

Enfim, obrigado.

[quote=rvlira]Como é possível instanciar um objeto do tipo Ave em uma referencia do tipo Animal? Dessa forma só estarão disponíveis os métodos e atributos da superclasse, não?

Em caso positivo, existe algum motivo para se instanciar um objeto de uma subclasse em referência do tipo da superclasse? Porque pelo que me parece não teria nenhuma função faer isso já que de fato o conteúdo da variável será da superclasse e não da subclasse, não é?[/quote]

Se continuar achando que isso não serve pra nada, sugiro que leia sobre o que é polimorfismo.

Exemplo:

public abstract class NumeroDeDocumento {

  /**
   * Imprime o número do documento formatado
   */
  public abstract String formatar(); 
}

public class CPF extends NumeroDeDocumento{

  /**
   * Imprime o CPF formatado como 000.000.000-00
   */
  public String formatar() {
     // implementar
  }
}

public class CNPJ extends NumeroDeDocumento {

  /**
   * Imprime o CNPJ formatado como 00.000.000/0000-00
   */
  public String formatar() {
     // implementar
  }
}

NumeroDeDocumento numero = new CPF("12345678901");
NumeroDeDocumento numero2 = new CPF("23456789000104").

System.out.println(numero.formatar()); // 123.456.789-01
System.out.println(numero2.formatar()); // 23.456.789/0001-04

O importante é não saber qual é a implementação, e sim o que ele deve fazer.

Compilação.

Como é possível instanciar um objeto do tipo Ave em uma referencia do tipo Animal? Dessa forma só estarão disponíveis os métodos e atributos da superclasse, não?

Em caso positivo, existe algum motivo para se instanciar um objeto de uma subclasse em referência do tipo da superclasse? Porque pelo que me parece não teria nenhuma função faer isso já que de fato o conteúdo da variável será da superclasse e não da subclasse, não é?
[/quote]

Existe diversar funcionalidades… vc pode querer apenas que vc tenha um Animal, o que te importa é apenas que seja um animal, não interessa se é uma ave, um macaco, um bizouro, um cavalo, o que interessa é que seja um animal, senod assim, tanto faz se os métodos especificos não aparecem, pois vc esta focando que ker um animal…

Por exemplo, vc pode ter uma lista, com N animais, essa lista pode conter, aves, sapos, lagartos, etc etc, desde que seja um animal…

isso é uma das grandezas do OO, o polimorfismo, que faz vc aceitar varias formas de animais…

Só por curiosidade: Isso geraria um erro durante a compilação ou execução? Onde estou agora não tenho como testar para ver.

Enfim, obrigado.[/quote]
em tempo de Compilação… pois fica claro para o compilador, que um new Animal(), de forma alguma pode ser uma ave…

porem vc pode ter algo como…

[code]Animal animal = getAnima();

Ave ave = (Ave)animal; //aki vc esta falando para o programa, que seu animal é uma AVE, e vc ker que a transformação seja feita
//porem caso o naimal, não seja na verdade uma Ave, seja apenas um animal, ou um cavalo por exemplo, uma exceção, em tempo de execução será chamada
//ClassCastException[/code]

Bruno, obrigado pela ajuda. Seu exemplo me fez ver claramente a aplicação do polimorfismo.

Lavieri, obrigado também pela ajuda na questão do polimorfismo e pela explicação sobre o cast em classes.

t+!