Dúvida Herança ou Polimorfismo?

6 respostas
I

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();

6 Respostas

dgouvea

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.

:slight_smile:

I

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()

?

I

Então a principal vantagem é o polimorfismo?

se eu quiser acessar os métodos de Terrestre, eu tb posso?

LPJava

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
	}
}
ViniGodoy

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();

ViniGodoy

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

Criado 21 de março de 2007
Ultima resposta 24 de mar. de 2007
Respostas 6
Participantes 4