Casting

6 respostas
evertonsilvagomesjav

Sobre esse casting aqui, ao olhar achei que dava ClassCastException, mas nao dá porque?

public class Veiculo {

	int numVeiculo;
	
	public void go(){
		
		System.out.println("Veiculo");
		
	}
	
}
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?
		
		
	}
	
}

essa me deixou com dúvida.

6 Respostas

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.

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

E

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.

Entendi perfeitamente :D. Muito Obrigado!!

Criado 3 de agosto de 2010
Ultima resposta 4 de ago. de 2010
Respostas 6
Participantes 3