Qual a vantagem?

Galera… estava olhando um exemplo no seguinte código:

[code]public class Foo {
public void doFooStuff() {
}
}

public class Bar extends Foo {
public void doBarStuff() {
}
}

class Test {
public static void main(String args[]) {
Foo reallyABar = new Bar(); **
}
}[/code]

** -> O que eu realmente não entendo… é porque que eu utilizo Foo nesta linha de código… tudo bem, entendo que é correto fazer isto… seguindo o conceito de herança, mas queria saber qual é a vantagem de estar utilizando desta forma ao invés dessa…

class Test { public static void main(String args[]) { Bar reallyABar = new Bar(); } }

Vlw

esse conceito eh parecido com o de utilizar interfaces, usar interfaces ou classes abstratas garante compatibilidade entre os códigos e permite que a manutenção seja mais fácil…

por exemplo, se um dia a classe Vector for deprecada do Java e vc tiver a declaração:
Vector meuVetor = new Vector();
, ao invés de:
List meuVetor = new Vector();
será necessário verificar a chamada de cada metodo a partir de meuVetor.metodo() pra verificar se nao estah imcompativel com a nova implementação.

outra vantagem é permitir que exista polimorfismo em tempo de execução, ou seja, vc declara a variavel como Map, mas dependendo de certos fatores ele será um TreeMap ou um HashMap, neste caso vc garante (através da contrato da interface Map) que tuas chamadas terão sempre a mesma assinatura para as possíveis classes implementadoras…

enfim, isso eh polimorfismo!

esse conceito eh parecido com o de utilizar interfaces, usar interfaces ou classes abstratas garante compatibilidade entre os códigos e permite que a manutenção seja mais fácil…

por exemplo, se um dia a classe Vector for deprecada do Java e vc tiver a declaração:
Vector meuVetor = new Vector();
, ao invés de:
List meuVetor = new Vector();
será necessário verificar a chamada de cada metodo a partir de meuVetor.metodo() pra verificar se nao estah imcompativel com a nova implementação.

outra vantagem é permitir que exista polimorfismo em tempo de execução, ou seja, vc declara a variavel como Map, mas dependendo de certos fatores ele será um TreeMap ou um HashMap, neste caso vc garante (através da contrato da interface Map) que tuas chamadas terão sempre a mesma assinatura para as possíveis classes implementadoras…

enfim, isso eh polimorfismo!