packagecom.certificação.polimorfismo;publicclassCarextendsVeiculo{intnumCar;publicvoidgo(){System.out.println("Car");}publicstaticvoidmain(String[]args){Carc=newCar();Carc2;c2=(Car)(Veiculo)c;// Aqui á variavel de ref "c" aponta para um objeto Car, "c" faz um casting para "Veiculo", válido pq "Car" é um "Veiculo", depois de fazer esse casting para "Veiculo" faz outro para "Car" como um "Veiculo" não é um "Car", porque não gera um ClassCastingException?}}
O cast leva em consideração o tipo que está dentro da variável.
Você fez um upcast e depois um downcast.
Geralmente, você só precisa fazer casting no segundo caso (de Veiculo para Car), pois é uma operação perigosa. Como você mesmo constatou, pode ser que o Veiculo não seja necessariamente um Car.
evertonsilvagomesjav
ViniGodoy:
O cast leva em consideração o tipo que está dentro da variável.
Você fez um upcast e depois um downcast.
Geralmente, você só precisa fazer casting no segundo caso (de Veiculo para Car), pois é uma operação perigosa. Como você mesmo constatou, pode ser que o Veiculo não seja necessariamente um Car.
Mas nesse caso Veiculo não é um Car, quando ocorre o downcast de Veiculo para Car pq não gera á exceçao? Não entendi .
E
entanglement
Você confunde variáveis (que contém referências a objetos) com objetos.
A classe de um objeto não se altera mesmo que o objeto seja submetido a um cast, que serve apenas para revelar uma “identidade” que esse objeto já tem.
Uma “identidade” de um objeto seria, por exemplo, alguma interface que é implementada pela classe desse objeto, ou então uma superclasse da classe desse objeto.
Se um objeto é do tipo Carro (que estende Veículo), ele sempre será um Carro, mesmo que referenciado por uma variável do tipo Veículo.
evertonsilvagomesjav
Puts nao tinha enchergado rs, quando ocorre Veiculo c = (Veiculo) new Car(); á variavel “c” passa no teste instanceof tanto para Car quanto para Veiculo, isso que esta acontecendo ai, né?
ViniGodoy
Sim.
Como o entanglement falou, por mais que a variável de referência seja um veículo, o veículo que está sendo apontado por ela é um carro. E não deixará de ser carro nunca mais.
Por isso você pode testar se o veículo que está sendo apontado é uma instância de carro.
evertonsilvagomesjav
ViniGodoy:
Sim.
Como o entanglement falou, por mais que a variável de referência seja um veículo, o veículo que está sendo apontado por ela é um carro. E não deixará de ser carro nunca mais.
Por isso você pode testar se o veículo que está sendo apontado é uma instância de carro.