[Duvida] Polimorfismo

Bom galera Estou lendo o livro Use a Cabeça Java

Cheguei na parte de polimorfismo pag(136);

O que acontece tentei criar um codigo simples encima do que eu li

Mais ta dando erro.

Abaixo o codigo:

Animal.JAVA
[code]public class Animal
{
String nome;
String tipo;

public void latir()
{
	System.out.println("Au Au");
}

public void miar()
{
	System.out.println("Miau Miau");
}

}
[/code]

Gato.JAVA

public class Gato extends Animal { String cor; int tamanho; }

TestarGato.Java (Tentei usar polimorfismo e ta dando erro);

[code]public class TestarGato
{

public static void main(String[] args) 
{
	Animal doug = new Gato(); <--- Tenho Duvidas
	
	doug.tamanho = 15;
	doug.cor = "Branco";
	doug.nome = "Doug";
	doug.miar();
	
	System.out.println(doug.nome + " " +  doug.cor + " " + doug.tamanho);
}

}

[/code]

O Erro tá tando no doug.tamanho e .cor que estao na classe gato… pq isso?

Alguem poderia dar uma mão?

Abraço!

Fala ae… Tenta assim…

public class TestarGato 
{

	public static void main(String[] args) 
	{
		Gato doug = new Gato(); 

		doug.tamanho = 15;
		doug.cor = "Branco";
		doug.nome = "Doug";
		doug.miar();
		
		System.out.println(doug.nome + " " +  doug.cor + " " + doug.tamanho);
	}

}

Voce so precisa instanciar o objeto Gato, ja que o proprio ja extends Animal, herdando as propriedades do Animal

Espero ter ajudado!

ME ajudou sim obrigado!!

Mais é que eu não entendi
essa parte

Animal var = new Gato();

Eu queria saber qnd posso usar isso porque são 2 classes diferentes instanciando um objeto?

Como seria isso sendo que ta dando erro.

Vc ta tentando criar um objeto VAR (do tipo Animal) instanciando o objeto Gato, os dois nao sao iguais.

Então eu nao poderia fazer isso?

Animal doug = new Gato()?

Abc obrg

O problema é o seguinte… quando vc faz

Animal var = new Gato();

vc esta falando que “var” é uma animal, e isso quer dizer, que para var, não importa c ele é um gato, um cachorro , um papagaio, ele é um animal e é isso que importa…

levando isso em conta… var não sabe se este animal tem Cor ou tem Tamanho… var so sabe o que um animal sabe… ou seja… que ele tem um nome, um tipo, … q sabe latir() e miar() …

mesmo sendo var, um gato, ele não se importa por gato, e so o enxerga como animal…

vc pode em algum momento ver o animal como um gato, e para tal teria que fazer algo como

Gato var2 = (Gato)var;

isso quer dizer que vc esta querendo passar a enchergar o animal var, como um gato, e ta fazendo um cast de Animal para Gato…

polimorfismo é isso… quando vc usa herança de animal… qualquer q seja o bixo q vc esteja criando, ele nunca vai deixar de ser um animal…

Entendi Brother!! Obrigado vou fazer uns testes aqui obrigado!

lembre-se… se vc fizer

Animal var = new Cachorro();

Não podera transformar animal var, em nada que ele não seja realmente… por exemplo

Gato var2 = (Gato)var;

vai gerar um erro de Cast, pois não sera possivel transformar o animal var que é um cachorro em um gato… as transformações de cast so poderão ser feitas dentro da mesma linha de herança

aQUI

public class TestarGato 
{

	public static void main(String[] args) 
	{
		Animal doug = new Gato();

		Gato doug2 = (Gato)doug;
		doug2.nome = "Doug";
		doug2.miar();
		doug2.tamanho = 15;
		doug2.cor = "Branco";		
		System.out.println(doug.nome + " " +  doug2.cor + " " + doug2.tamanho);
		
		
	}

}

Ficaria assim então né[url]?

Obrg

Se não quiser criar um nova variável daria pra fazer assim

public class TestarGato 
{

	public static void main(String[] args) 
	{
		Animal doug = new Gato();

		((Gato)doug).nome = "Doug";
		((Gato)doug).miar();
		((Gato)doug).tamanho = 15;
		((Gato)doug).cor = "Branco";		
		System.out.println(doug.nome + " " +  doug2.cor + " " + doug2.tamanho);
		
		
	}

}

Ps.: não é bom acessr atributos diretamente… a melhor forma é criar métodos sets para modificar atributos e gets para ler atributos

E aí Gabriel

Neste seu caso, realmente, como os amigos disseram anteriormente, uma variavel de referencia do tipo Animal, faz coisas de animal, e não coisas específicas de um Gato.

Animal animal = new Gato(); animal.cor = "branco"; // Isso não funciona!!!!

Isso não funciona pq o Java “olha” para o TIPO da variavel de referencia. E não para o OBJETO na qual está referenciando entendeu?

Podemos dizer que um Gato É-UM Animal. Mas um Animal NÃO-É-UM Gato.
Se vc quer fazer coisas de Gato, tem que fazer uma tipagem de Gato. Ou o Cast como os amigos postaram.

Gato animalGato = new Gato(); animalGato.cor="branco"; //Isso funciona!!!

Aí vc pergunta. Onde está o polimorfismo?

Bom, vamos supor que uma outra classe, que é o Veterinário, trata vários tipos de ANIMAIS. E Veterinario tem um método, chamado tratar(). Mas ele trata algo. O que seria? Um Animal.
Portanto, o método pode ser algo como isto: void tratar(Animal qualquerAnimal).

Qualquer Animal pode ser passado para este método!! Isto é o polimorfismo na prática!!!

class Veterinario {
    public void tratar (Animal animal) {
        // Faz coisas com animal
    }
}

O Veterinario trata um Gato, Cachorro, Coelho, Cavalo…qq coisa que extenda Animal. Se um dia vc criar uma classe Urso que extenda animal, vc não tem que alterar nada no método tratar!
No main:

Gato g = new Gato();
g.cor = "branco";

Veterinario pet = new Veterinario();
pet.tratar(g); // Gato É-UM Animal. Polimorfismo!

Espero ter ajudado. []´s

Olá gente…eu tenho uma dúvida semelhante, mas diferente ao mesmo tempo.

No meu código abaixo:

package polimorfismo;

public interface Pai 
{	
	void Polimorfismo();
}

class Neto extends Filho implements Pai
{
	public void Polimorfismo()
	{
		System.out.println("Chama função FILHO");		
	}
}

class Filho
{
	public void Polimorfismo()
	{
		System.out.println("Chama função NETO");
	}
	
	public void getSaida()
	{
		System.out.println("Saáda em Filho");
	}
}

class Main
{
	public static void main(String[] args) 
	{
		Pai pai = new Neto();
		pai.getSaida();
	}
}

Por que eu não consigo acessar o método getSaida da classe Filho, se a classe Neto deriva dela?

Pq em tempo de execução que é feito isso, em tempo de compilação vc precisaria ter um método getSaida na classe Pai.

Não entendi ainda o porquê!

Com um cast para Neto, funciona (lógico que sim…rs).

Se Neto deriva de Flho, que tem a função getSaida() e Neto implementa Pai, para mim :

Pai pai = new Neto();
pai.getSaida();

deveria funcionar…

Implementação (implements) é quase a mesma coisa que derivação, só que deriva somente a interface.

A explicação seria, por acaso…

Neto é Pai (em polimorfismo e de acordo com as classes), mas Filho não é Pai?
Por isso que acesso os métodos de Neto por:

Pai pai = new Neto();
pai.funcaoQualquerDentroDeNeto;

e não de Filho?

Quando vc faz:

Pai pai = new Neto(); 

Ocorre implicitamente:

Pai pai = (Pai) new Neto(); 

Ou seja esse objeto Neto faz um Casting para Pai entao a variavel “pai” contém todos atributos da classe Pai, porém com o polimorfismo ele chama métodos sobrescritos na classe Neto, MAAAASSS pai nao tem o método getSaida() que vc quer chamar, logo nao tem sobreescrição. Entendeu?

Sim, entendi…

Vlw bro!