Downcasting

Bem estou com dúvidas em relação a downcasting em um programa que eu fiz usando poliformismo irei colocar o código para ficar mais fácil o entedimento
classe testa 1:

package com.testes.novos;

public class testa1 extends testa3
{
	private double totalRecebido;

	public testa1(String firstName, String lastName, String password, double salario, double comissao,double totalRcebido) 
	{
		super(firstName, lastName, password, salario, comissao);
		setTotalRecebido(totalRecebido);
	
	}
	
	public void setTotalRecebido(double totalRecebido)
	{
		this.totalRecebido=(super.getComissao()+super.getSalario());
	}
	
	public String toString()
	{
		return("Este objeto referencia a subclasse"+"\n"+"Nome:"+super.getFirstName()+"\n"+
				"Sobrenome: "+super.getlastName()+"\n"+"Senha: "+super.getPassword()+"\n"
			   +"Salário: "+super.getSalario()+"\n"+"Comissão "+super.getComissao()+"\n"+
				"O total recebido é "+totalRecebido);
	}
	

}

classe testa 2:


package com.testes.novos;

public class testa2 
{
	

	public static void main(String args[])
	{
		// atribui uma referencia de super classe a variavel de superclasse
		 testa3 chama = new testa3("Edson","Catugy","81345800786",500.00,54);
		 
//		 atribui uma referência de subclasse a variável de subclasse   
		 testa1 chama1= new testa1("Marcos","Lace","48118712647",450.0,1002,123);
		 
//		 invoca toString no objeto de superclasse utilizando a variável de superclasse
		 System.out.println(chama.toString());
		 
		 System.out.println();
//		 invoca toString no objeto de subclasse utilizando a variável de subclasse  
		 System.out.println(chama1.toString());
		 
		 testa3 chamaSub = chama1;
		 System.out.println();
		  // invoca toString no objeto de subclasse utilizando a variável de superclasse
		 System.out.println(chama1.toString());
		 
	}

}

classe testa 3:

package com.testes.novos;

public class testa3 
{
	private String firstName;
	private String lastName;
	private String password;
	private double salario;
	private double comisao;
	
	public testa3(String firstName,String lastName,String password,double salario,double comissao)
	{
		this.firstName=firstName;
		this.lastName=lastName;
		this.password=password;
		setSalario(salario);
		setComissao(comissao);
		
		
	}
	
	public void setSalario(double salario)
	{
		this.salario=((salario<0)?0:salario);
	}
	
	public void setComissao(double comissao)
	{
		this.comisao=((comissao<0)?0:comissao);
	}
	
	public String getFirstName()
	{
		return firstName;
	}
	
	public String getlastName()
	{
		return lastName;
	}
	
	public String getPassword()
	{
		return password;
	}
	
	public double getSalario()
	{
		return salario;
	}
	
	public double getComissao()
	{
		return comisao;
	}
	
	public String toString()
	{
		return("Este objeto referencia a super classe "+"\n"+"Nome: "+firstName+"\n"+
				"Sobrenome: "+lastName+"\n"+"Senha: "+password+"\n"+"Sálario: "+salario+
				"\n"+"Comissão: "+comisao);
	}

}

Bem nesta parte do programa eu fiz downcasting, “testa3 chamaSub = chama1;”, passando a referencia da subclasse para minha referência da superclasse, mais quando eu faço isso eu so posso usar métodos da minha subclasse? porque não posso usar tanto da superclasse quanto da subclasse.???

Não entendi o que você não conseguiu fazer.

Por que esse comando é válido:

chamaSub.getFirstName();

Sendo que esse método está declarado na super classe.
Outra coisa, você não fez cast, pois a parte esquerda da atribuição já é do tipo da parte direita, então seria a mesma coisa de fazer:

cham1.getFirstName();

Outro detalhe, acostume-se a sempre colocar a inicial de toda classe maiúscula.

Espero ter ajudado, flw.

Porque o Java não poderá assumir com 100% de certeza, para qual das subclasses que a referência da classe pai está apontando.

Para chamar um método da sub-classe, só com um casting explicito:

((SubClasse)refDaSubClasse).metodoDaSubClasse();

Exemplo:

[code]class Animal {
public String getCor() {
return “amarelo”;
}
}

class Cachorro extends Animal {
public String getCor() {
return “Vermelho”;
}

public void latir() {
   System.out.println("Auau!");
}

}

Cachorro c = new Cachorro();
System.out.println(c.cor()); //Imprime vermelho.

Animal a = c; //Ok, todo cachorro é um animal.
System.out.println(c.cor()); //Imprime vermelho.

c.latir(); //Imprime Auau!
// a.latir(); //Problemas!!! Nem todo animal é um cachorro!

//Embora o Java não possa afirmar que o animal é um cachorro, você pode.
//Se eventualmente não for um cachorro, você recebe um ClassCastException.
((Cachorro)a).latir(); //Imprime Auau!
[/code]

[quote=ViniGodoy]Exemplo:

[code]class Animal {
public String getCor() {
return “amarelo”;
}
}

class Cachorro {
public String getCor() {
return “Vermelho”;
}

public void latir() {
   System.out.println("Auau!");
}

}

Cachorro c = new Cachorro();
System.out.println(c.cor()); //Imprime vermelho.

Animal a = c; //Ok, todo cachorro é um animal.
System.out.println(c.cor()); //Imprime vermelho.

c.latir(); //Imprime Auau!
// a.latir(); //Problemas!!! Nem todo animal é um cachorro!

//Embora o Java não possa afirmar que o animal é um cachorro, você pode.
//Se eventualmente não for um cachorro, você recebe um ClassCastException.
((Cachorro)a).latir(); //Imprime Auau!
[/code]
[/quote]

Você esqueceu de colocar “Cachorro extends Animal”.

Tem razão! :oops:
Já está corrigido! :wink: