E ae pessoal, minha dúvida é a seguinte:
Tenho uma classe mãe Veiculo e uma subclasse Terrestre, qual é a vantagem de fazer isso (abaixo):
Veiculo x = new Terrestre();
E ae pessoal, minha dúvida é a seguinte:
Tenho uma classe mãe Veiculo e uma subclasse Terrestre, qual é a vantagem de fazer isso (abaixo):
Veiculo x = new Terrestre();
Que a sua variável x terá somente os métodos da classe Veiculo, mas sua implementação será da classe Terrestre.
Você pode criar um método que receba um parâmetro Veiculo e dentro dele você realiza operações para qualquer veículo, ao invocar o método você pode passar como parâmetro qualquer classe que herde a classe Veiculo.

tá mas eu tô criando uma referência para qual classe, e se eu vou ter os métodos de veículo, pq eu não referenciar apenas veículo;
Veiculo x = new Veiculo()
?
Então a principal vantagem é o polimorfismo?
se eu quiser acessar os métodos de Terrestre, eu tb posso?
uma das vantagem de fazer isso que vc quer chamar o metodo que foi subscrito da class mae que está na class filha… mais na verdade vc tem um objeto Terrestre do tipo Veiculo…
e quando vc tem:
Veiculo v = new Veiculo();
vc so pode chamar os metodos ou acessar as variaveis de instancia dessa class… e a respeito do primeiro… vc pode chamar os metodos apenas que pertence a class mae e q tem na class Terrestre, enfim aqueles que foi herdado e aprimorado…
olhe esse codigo com bastante atenção…
public class Animal
{
public void printYour(){
System.out.println("chamei a super class");
}
}
class Horse extends Animal{
public void printYour(){
super.printYour();// chama a superclass
}
public void buck(){}
}
public class TestAnimal
{
public static void main(String args[]){
Animal a = new Animal();
Animal b = new Horse();//referencia animal, mais eh um objeto horse
/*Animal c = new Horse();*/
//dar erro pq a class animal nao tem o metodo buck e sim a class horse.
//c eh um objeto horse mais nao referente a classe animal.
//Horse c = new Horse(); agora eu digo que vou invocar o metodo da class horse a qual meu objeto
// está sendo referenciado
a.eat();//chamo o método da classe referente
b.eat();
//c.buck(); // esse método não temos no tipo da class animal
}
}
A vantagem é justamente programar a classe que faz isso, sem usar os métodos de terrestre.
Isso porque, mais para frente, você pode decidir que Terrestre não é a melhor classe para ser usada nesse caso, mas sim, a classe Anfibio. Você muda a declaração, mas o resto do código (que não usou nada específico de Terrestre e nem usará de Anfibio) continua funcionando.
Essa técnica é muito útil quando você tem uma interface (ou superclasse) comum a vários tipos de implementação. Ou seja, a implementação específica pode até variar, mas o uso da classe não.
Um exemplo disso é o caso das listas. Toda lista tem os métodos add, remove, clear, size, etc. Mas existem diversos tipos de listas: LinkedList, ArrayList, ListaCircular, etc… Embora as implementações diferentes, não muda muito a forma como se usa uma lista de uma implementação para outra…
Então, você pode fazer:
List minhaLista = new ArrayList();
E, depois, com o uso do sistema, perceber que uma LinkedList se encaixaria melhor naquela situação. Aí você vai na declaração e troca por:
List minhaLista = new LinkedList();
Novamente a dúvida surgiu e resolvi fazer um post mais completo.
Se você ainda não viu, dê uma olhada em:
http://www.guj.com.br/posts/list/55387.java#290673