Polimorfismo / Casting de Objetos

Ae galera , sei que é uma dúvida básica no java , mas ainda não consegui assimilar direito esse conceito java , eu sou Programador Visual Basic e to estudando Java para mudar de linguagem , só que estava indo tudo bem nos meus estudos até chegar nessa parte…alguém poderia me explicar como isso funciona se possivel com exemplo…

Obrigado…

Clodoaldo
Analista Programador

A idéia de polimorfismo é a de um certo objeto poder ter vários comportamentos simultaneamente. Complicou ao invés de explicar?
O conceito de OO é de simplesmente representar características importantes (para um certo domínio) de entidades do mundo real em um software. Estas entidades, no mundo real, possuem suas propriedades e alguns comportamentos. Por exemplo, se você for até a sua sala de estar, provavelmente você verá alguns sofás e cadeiras. Ambos são móveis, que possuem características diferentes. Sofás são macios, confortáveis, maiores e nos permitem deitar. Já as cadeiras, normalmente não são tão confortáveis assim, são menores e são mais leves do que os sofás. Mas, tanto os sofás quanto as cadeiras, servem para um mesmo propósito (sentar), apesar de suas características (implementações) diferirem.

Mas, afinal :roll: , para que serve polimorfismo então? Uma das respostas pode ser: dar diferentes implementações para comportamentos/propósitos comuns.

Então, segundo o paradigma da OO, poderíamos modelar a sua sala da seguinte maneira:

[code]public class Movel{
//… métodos, atributos, e construtores aqui…
}

public class Sofa extends Movel{
//… inclusão de métodos/atributos/construtores adicionais
}

public class Cadeira extends Movel{
//… inclusão de métodos/atributos/construtores adicionais
}[/code]

Basicamente, é isso. Agora, quer saber como funciona?

[code]public interface Movel{

public int lugares();

public boolean isConfortavel();
//… o que mais sua imaginação quiser…
}

public class Sofa implements Movel{

private int lugares;
private boolean confortavel;

public Sofa(int lugares){
if (lugares > 0) this.lugares = lugares;
else this.lugares = 1;
confortavel = true;
}

public int lugares(){
return lugares;
}

public boolean isConfortavel(){
return confortavel;
}
}

public class Cadeira implements Movel{

private int lugares = 1;
private boolean confortavel = false;
private int pernas;

public Cadeira(int pernas){
if (pernas > 2) this.pernas = pernas;
else this.pernas = 3;
}

public int lugares(){
return lugares;
}

public boolean isConfortavel(){
return confortavel;
}

public int pernas(){
return pernas;
}
}

public class Sala{

public static void main(String[] args){
// arrumando os móveis na minha sala…
Movel[] sala = new Movel[4];
sala[0]= new Sofa(3);
sala[1]= new Sofa(2);
sala[2]= new Sofa(1);
sala[3]= new Cadeira(3);
// faz qq outra coisa …
}

}[/code]

:wink: ops…

Só completando o q disseram acima…
Polimorfismo:torna possível implementar sistemas que são mais facilmente extensíveis.Permite escrever programas para processar genericamente-como objetos de superclasse-objetos de todas as classes existentes em uma hierarquia,permitindo que métodos de mesmo nome efetuarem tarefas diferentes,em função da classe que as utiliza(na qual o método é definido).Resumindo:Reutilização do mesmo nome para um conceito correlato de tipos diferentes.
Em Java devemos observar dois momentos: de COMPILAÇÃO e de EXECUÇÃO para analisar os objetos.O sistema escolherá qual método que deve ser utilizado por meio de:
1- Sobrecarga(Overloading)-comparação feita em tempo de compilação
que analisa qual método possui os tipos de argumentos correspondentes e escolhe o método que será usado.É utilizado no caso de métodos de mesmo nome,definidos em uma mesma classe,com argumentos diferentes.
2-Sobreposição(Overriding)-comparação feita em tempo de execução que analisa qula método foi definido para este tipo de objeto e se existe
uma redefinição deste método na classe do objeto ou deve ser usado o
método definido na superclasse.

Observação sobre casting:
Quando atribuímos um objeto de uma classe superior na hierarquia das classes a um objeto de uma classe inferior devemos fazer um (casting) . De baixo para cima nao é necessário.

Obrigado pessoal…

Aproveitando a boa vontade de vcs…poderiam me explicar o pq do funcionamento do código seguinte :

public class Empregado{
protected String Nome;
protected String Endereco;
protected int Idade;

public Empregado(String Nome,String Endereco,int Idade){
	this.Nome = Nome;
	this.Endereco = Endereco;
	this.Idade = Idade;
}

public void mostraDetalhes(){
	System.out.println("Nome : " + Nome +
	"

Endereco : " + Endereco + "
Idade : " + Idade);
}

public class Diretor extends Empregado{
protected String Secretaria;

public Diretor(String Nome,String Endereco,int Idade,String Secretaria){
	super(Nome,Endereco,Idade);
	this.Secretaria = Secretaria;
}

public void mostraDetalhes(){
	super.mostraDetalhes();
	System.out.println("Secretaria : " + Secretaria);
}


public static void main(String args[]){
	Empregado e = new Diretor("Michelle","testet",20,"ddfdf"); //Polimorfismo
	Diretor d = (Diretor)e;   //Casting
	d.Secretaria = "Michelle";
}

}

Blz…no método main , eu declarei uma váriavel do tipo Empregado e passei pra ela uma instância da classe Diretor.
Em seguida declarei uma variável como sendo do tipo Diretor e fiz um casting com a variável e passando ela para diretor , esse processo está correto ?Minha intensão era de restaurar as funcionalidades da classe Diretor já que na primeira declaração eu só conseguia acessar os ítens da classe Empregado…

Não se se fui claro…

Obrigado mesmo assim…

Se sua intensao era apenas restaurar as funcionalidades da classe Diretor,está correto o Casting…mas isso é totalmente desnecessário se vc quer executar as funcionalidades de Diretor pq ela herda os métodos de Empregado.É só vc declarar a variável como do tipo Diretor
Diretor d = new Diretor(“Michelle”,“testet”,20,“ddfdf”);
e acessá-la naturalmente…
System.out.println( d.Secretaria);//imprimirá ddfdf…

e por aí vai…