[quote=charlesbraw]evertonsilvagomesjava,
Na verdade essa parte:
[quote]Veiculo v = new Veiculo();
Carro c = new Carro();
Veiculo vc = new Carro();
[/quote]
eu entendo perfeitamente,
o que não sei fazer é ler esse tipo de conversão:
Veiculo v2 = (Carro)v;
Veiculo v3 = (Veiculo)c;
Carro c2 = (Veiculo)c;
Sei que alguns casos da Erro de ClassCastException, alguns não compilam, outros são downcasting e upcasting.
Gostaria de aprender a fazer esse cast de objetos e saber seu funcionamento.
valeu.[/quote]
Então cara, esses exemplos são exatamente as mesmas coisas.
Quando vc faz:
Veiculo v2 = (Carro)v // A variavel de referencia "v" contém uma referencia para um objeto Veiculo. Nesse caso seria o mesmo que: Carro c = (Carro)new Veiculo(). Porém um Veiculo não É-UM Carro, por isso gera um ClassCastException
Veiculo v3 = (Veiculo)c; // Aqui sua variavel de referencia "c" contém uma referencia para um objeto Carro. Seria o mesmo que: Veiculo v3 = (Veiculo) new Carro(). Aqui é valido o uso do polimorfismo porque um Carro É-UM Veiculo.
Carro c2 = (Veiculo)c; // Aqui sua variavel "c" possui uma referencia para um objeto Carro, vc precisa definir um casting para Carro antes de atribuir e a sintaxe ficaria assim: Carro c2 = (Car) (Veiculo)c, porque um objeto Veiculo pode nao ser um objeto Carro. Vamos alisar o primeiro casting, que por sinal é um upcasting, (Veiculo)c seria mesma coisa se fizermos: Veiculo c = (Veiculo) new Car(). Neste caso á variavel "c" passa no teste É-UM tanto para Car quanto para Veiculo devido ao uso de polimorfismo. Após isso é feito um segundo casting, onde ocorre um downcasting Carro c2 = (Car)(Veiculo)c. Note que como á variavel "c" passa no teste É-UM tanto para Veiculo quanto para Car devido ao primeiro casting, então é valido fazer esse segundo downcasting (Car)(Veiculo), e á atribuição é correta, sem gerar ClassCastException.