Casting

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 :cry: .

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!!