Cast - Ajuda

Pessoal TO PRECISANDO usar isto e não consigo… Leia o trecho abaixo e respondam qual é a saida, sem compila-la, então compilem e me digam pq sai isto, msm q não saibam o pq respondam qual foi a saida q imaginaram quando leram – pergunta da sun…

public class Cast {
	public static void main(String[] args) {
		A var = new A();
		var.incrementa();
		
		A1 var1 = (A1)var;
		var1.incrementaB();
		
		System.out.println(var.x);//editado
	}
}

class A{
	int x;
	
	A(){
		x = 0; 
	}
	
	void incrementa (){
		x++;
	}
}

class A1 extends A{
	void incrementaB(){
		x+=5;
	}
}

Não compilei, mas acho que a saída é 6, está certo isso?!

errado. isso é o q quero fazer

Hum… compilei aqui mas deu erro na linha 6…

Acho que é porque vc nào pode fazer cast de uma classe pai para filha, somente da filha para a pai… Agora que reparei :slight_smile:

mas olhe só…
Graphics2D extends Graphics
e vc pode fazer o cast

public void paint (Graphics g){
Graphics2D g2 = (Graphics2d)g;
}

é…
Tô dando uma olhada aqui…
estranho né :confused:
Essas coisas confundem a gente às vezes… quando eu acho que estou entendendo, aparecem casos assim… :confused:

Olá flasoft!
Dá erro pelo seguinte: A instância referênciada pela variável var é do tipo A, e não tem como vc converter de A para A1.
Isto só daria certo se a instância armazenada por var fosse uma instância de A1, ou de alguma classe filha, neta, etc de A1:

 	public static void main(String[] args) {
 		A var = new A1();
 		var.incrementa();
 		
 		A1 var1 = (A1)var;
 		var1.incrementaB();
 		
 		System.out.println(var.x);//editado
 	}

Por que isto acontece? Porque não tem como vc utilizar uma referência de uma classe filha(A1 var1) para referenciar um objeto de uma classe pai(new A()). Perceba que isto é meio lógico, pois se var1 é do tipo A1, vc poderia fazer…

var1.incrementaB();

…Só que var1 estaria “apontando” para uma instância do tipo A, que não tem definido o método incrementaB(). Por isso que o compilador não permite que seja feito tal tipo de cast, e lança um ClassCastException
Qq dúsvida, pergunte mais, ok!

[quote=Mantu]Olá flasoft!
Dá erro pelo seguinte: A instância referênciada pela variável var é do tipo A, e não tem como vc converter de A para A1.
Isto só daria certo se a instância armazenada por var fosse uma instância de A1, ou de alguma classe filha, neta, etc de A1:

 	public static void main(String[] args) {
 		A var = new A1();
 		var.incrementa();
 		
 		A1 var1 = (A1)var;
 		var1.incrementaB();
 		
 		System.out.println(var.x);//editado
 	}

Por que isto acontece? Porque não tem como vc utilizar uma referência de uma classe filha(A1 var1) para referenciar um objeto de uma classe pai(new A()). Perceba que isto é meio lógico, pois se var1 é do tipo A1, vc poderia fazer…

var1.incrementaB();

…Só que var1 estaria “apontando” para uma instância do tipo A, que não tem definido o método incrementaB(). Por isso que o compilador não permite que seja feito tal tipo de cast, e lança um ClassCastException
Qq dúsvida, pergunte mais, ok![/quote]

Pois é, eu falei isso ali em cima, mas o Flasoft falou sobre

Graphics2D extends Graphics
//e vc pode fazer o cast

public void paint (Graphics g){
Graphics2D g2 = (Graphics2d)g;
}

Como fica neste caso?!

é eu dei uma pesquisada e isso realmente acontece…

e por isto, por certo no metodo

public void paint(Graphics g){
     Graphics2D g2 = (Graphics2D)g;
}

obj passado por parametro é do tipo Graphics2D…

ex:
Graphics2D gra2 = null;
this.paint(gra2);

Então a unica coisa q fazemos em um Cast é faze-lo voltar em a sua forma anterior(filha)?

Palmas pra vc, Flasoft! :thumbup:

Então podem me ajudar com um Problema de OO?

Pode falar! Mas se for muito diferente desse tópico aqui, melhor abrir outro, pra que outros GUJnautas possam ver sua nova questão

Já estou abrindo…

[quote=Flasoft]é eu dei uma pesquisada e isso realmente acontece…

e por isto, por certo no metodo

public void paint(Graphics g){
     Graphics2D g2 = (Graphics2D)g;
}

obj passado por parametro é do tipo Graphics2D…

ex:
Graphics2D gra2 = null;
this.paint(gra2);

Então a unica coisa q fazemos em um Cast é faze-lo voltar em a sua forma anterior(filha)?[/quote]

No caso que você mostrou:
Graphics2D g2 = (Graphics2D)g;

O casting é valido pois o parametro do metodo recebe um Graphics g, mas lembresse que é uma variável do tipo Graphics que não tem uma referência a Graphics, portanto o casting é valido!!a variável g PODE ter uma referência a Graphics2D, no caso de não ter uma ClassCastException será lançada em tempo de execução…