Sobre esse casting aqui, ao olhar achei que dava ClassCastException, mas nao dá porque?
[code]public class Veiculo {
int numVeiculo;
public void go(){
System.out.println("Veiculo");
}
}[/code]
[code]package com.certificação.polimorfismo;
public class Car extends Veiculo{
int numCar;
public void go(){
System.out.println("Car");
}
public static void main(String[] args) {
Car c = new Car();
Car c2;
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?
}
}
[/code]
essa me deixou com dúvida.
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.
[quote=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.[/quote]
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
.
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.
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é?
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.
[quote=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.[/quote]
Entendi perfeitamente :D. Muito Obrigado!!