Poliformismo básico

Entao pessoal, eu estava estudando poliformismo aqui com meu livro do deitel e pela apostila da caelum e neles eu vi que, por exemplo em uma hierarquia em que a classe Professor extends da classe Funcionarios, eu posso declarar as variáveis que vao receberer o valor de referencia dos objetos desses dois jeitos:

Funcionarios professor = new Professor();

e

Professor professor = new Professor();

so que aí fiquei com uma dúvida, lendo eu vi que o que importa é o " new Professor() ", ou seja, a variável professor vai conter a referência para Professor, mas tem alguma diferença, ou faz alguma diferença, eu declarar

Funcionarios professor

ou

Professor professor

Eu posso escolher aleatoriamente se declaro do primeiro jeito ou do segundo?

não sei se minha pergunta ficou muito clara =/

Olá

A classe filha (a que possui o extends) passa a possuir além das características próprias ela terá tbm as da classe pai, ou seja a classe que ela está estendendo.

Exemplo:

[code]
public class veiculo{
public String combustivel;
public String renavam;
}

public class caminhao extends veiculo{
public double tamanho_carroceria;
public double largura_bau;
}[/code]
perceba que a classe caminhao além dos atributos que a classe veiculo possui, ela ainda tem as próprias.

Espero que vc já tenha chegado a esta conclusão, mas se ainda não chegou, lá vai, vc declara(instanciar) a classe caminhão (cam = new caminhao) vc terá os atributos e métodos dela e mais os de veiculo.
Enquanto se vc instanciar a classe veiculo possuirá os atributos e métodos da classe veículo.

Acho que tá explicado.

Abraço

Depende do que você quer fazer…

No seu caso, voce tem a classe Funcionario e Professor (sempre no singular, lembre-se disso)…
Lógicamente, se sua classe Professor extende a classe Funcionario, é provável que você tenha implementado alguns métodos específicos só pra ela…

Agora é a hora em que você escolhe o que está fazendo… você precisa fazer algum cálculo, alguma coisa específica para um Professor? Por exemplo, listar quais os cursos que ele ministra? Instancie uma variável do tipo Professor…

Precisa fazer algo mais “genérico”, como calcular o salário, ou algo do tipo, que seja comum pras duas? Ou seja, tanto faz se for um Professor, um Pedreiro, um Flanelinha, o que importa é que seja um Funcionario, pois o método está nessa classe… nesse caso tanto faz, Funcionario seria mais adequado pois você as vezes não tem certeza de qual “tipo” é essa variável, pode ser que você esteja recuperando um Funcionario qualquer do banco, mas não sabe qual a especialidade dele, mas sabe que por ser um Funcionario vai ter o método que precisa… então instancie como Funcionario…

O Java não enxerga os métodos especificos de cada classe a não ser que você instancie ela com o tipo correto, ou faça um cast (pesquise isso se não conhece ainda)…

Não sei se deu pra entender… :roll:

Exemplificando o que o Marcelo quis dizer…

public class A {
   public void temEsseMetodo(){}
}

public class B extends A {
   public void temAqueleMetodo(){}
}

public class TestPolimorfismo {
   public static void main(String []args){
      A a = new A();
      B b = new B();
      A c = new B();

      a.temEsseMetodo(); //OK
      a.temAqueleMetodo(); // ERRO - A não enxerga o que B tem
      b.temEsseMetodo(); //OK
      b.temAqueleMetodo(); //OK
      c.temEsseMetodo(); //OK
      c.temAqueleMetodo(); // ERRO - Acontece que mesmo o Objeto sendo um B, ele é do tipo A... logo a JVM espera que qualquer coisa que chegue 
                                      //             aqui, possa enxergar temEsseMetodo() mas não tem como saber se o que você passou para o tipo A tem algum
                                      //             outro método de alguma outra classe... Logo temAqueleMetodo() sendo específico de B não é aceito em A, A
                                      //             A nunca poderá saber que B tem algum método específico mesmo que você programador saiba...
   }
}

Abs []

Putz velho…
Valeu ai pessoa nem sabia disso, é que eu tava utilizando sempre os mesmos métodos na classe pai e subscrevendo(@Override) eles na classe filha… por isso nao tinha conseguido entender a diferença.