Duvida sobre polimorfismo

seguinte tenho a classe pai que é

package br.com.inlife.polimorfismo;

public abstract class CPessoa {
	
		private String sNome;
		private String sEmail;
		private String sRg;
		private String sEndereco;
		private String sCidade;
		private int iConta;

		CPessoa() {
		}
		
		void lavaRoupa(){
			System.out.println("Lavadora Default");
		}

		CPessoa(String pNome, String pEmail,String pRg,String pEndereco,String pCidade,int pConta) {
			this.sNome = pNome;
			this.sEmail = pEmail;
			this.sRg = pRg;
			this.sEndereco = pEndereco;
			this.sCidade=pCidade;
			this.iConta = pConta;
		}
		public String getNome(){
			return sNome;
		}
		public String setNome(String pNome){
			return sNome = pNome;
		}
		public String getEmail() {
			return sEmail;
		}
		public String getRg(){
			return sRg;
		}
		public String getEndereco(){
			return sEndereco;
		}
		public String getCidade(){
			return sCidade;
		}
		public int getConta(){
			return iConta;
		}
		void salario(int salario){
			System.out.print("o seu salario é o salario base da empres 700,00 ");
		}

}

minha duvida não se diz ao codigo inteiro, faço o seguinte tenho mais duas classes que sobrescrevem o metodo lava roupa certo

package br.com.inlife.polimorfismo;

public class CPessoaMae extends CPessoa{
	void lavaRoupa(){
		System.out.println("Mãe lava a roupa");
	}

}

e minha outra classe que tambem extend de minha classe pai

package br.com.inlife.polimorfismo;

public class CPessoaFilha extends CPessoa{
	
	void lavaRoupa(){
		System.out.println("Filha lava a roupa");
	}

}

e tenho uma classe para fazer testes


package br.com.inlife.polimorfismo;

public class CPessoaTest {

	public static void main(String[] args) {
		
		CPessoa joanaFilha = new CPessoaFilha();		
		CPessoa joanaMae = new CPessoaMae();
		
			

	}

}

agora minha duvida… criei um objeto que aponta para minha variavel CPessoaFilha e outro que aponta na memoria para CPessoaMae que tem os metodos sobrescritos para lavar roupas, como faço para imprimir as dois métodos lavar roupas com apenas uma chamada…

Desculpa minha ignorância mas não consegui ver utilidade na sua necessidade. Da forma que está falando, teoricamente, qualquer Pessoa irá lavar roupa no mesmo momento, para mim não faz sentido. Outra coisa, eu acho (vou olhar com mais calma os conceitos de herança novamente) que isso é impossível ser feito, porque Pessoa não tem como saber da existência das instancias que herdam dela.

Quero ler outras opiniões.

Este tópico eu vou ficar atento! :smiley:

Cara, não entendi o q vc quis dizer com “apenas uma chamada”, poderia explicar melhor p/ eu ver se consigo te ajudar.

Seguinte, quando você fez isso, subescreveu o metodo lavaRoupa() da classe principal “CPessoa.java”, ou seja o metodo lavaRoupa() da classe CPessoa.java vai ser ignorado, o que metodo que vai ser executado é o lavaRoupa() da classe CPessoaMae.java.


public class CPessoaMae extends CPessoa{
	void lavaRoupa(){
		System.out.println("Mãe lava a roupa");
	}

}

caso quiser que imprimi também pelo lavaRoup() da classe CPessoa.java, faça da seguinte forma.


public class CPessoaMae extends CPessoa{
	void lavaRoupa(){
          super.lavaRoupa();//executa primeiro o lavaRoupa() na classe CPessoa.java
		System.out.println("Mãe lava a roupa");
	}

}

É só você invocar o método lavaRoupa() em cada um dos objetos. A JVM vai identificar em tempo de execução que objeto sua variável de referência está realmente instanciando e vai chamar o método sobrescrito.

Mais ou menos assim:

[code]package br.com.inlife.polimorfismo;

public class CPessoaTest {

public static void main(String[] args) {  
    CPessoa joanaFilha = new CPessoaFilha();          
    CPessoa joanaMae = new CPessoaMae();

    joanaFilha.lavaRoupa();
    joanaMae.lavaRoupa();

} 

}[/code]Se você quiser fazer uma chama só ao método pode colocar seus objetos em uma array ou uma coleção de CPessoa e depois iterar pelos objetos em um loop:

[code]CPessoa[] cpessoa = new CPessoa[2];
cpessoa[0] = new CPessoaFilha();
cpessoa[1] = new CPessoaMae();

for(CPessoa cp : cpessoa){
cp.lavaRoupa();
}[/code]

obrigado pelas respostas mas, minha duvida não é chamar o método da classe em questão e sim trabalhar com o polimorfismo de forma que , criássemos um método inteligente para saber quem iria chamar e se eu incluísse mais uma classe filha apenas a instanciava mais genericamente com a classe pai. por exemplo


void imprimeTudo(){
  chamaria o metodo para imprimir aki;
}

Não sei se entendi direito mas com polimorfismo vc pode chamar os métodos sobrescritos apenas instanciando as classes filhas, ex:

private CPessoa cp;

public void imprimeTudo() {
    cp = new CPessoaFilha();
    cp.lavaRoupa();  // executa o método da classe CPessoaFilha;

    cp = new CPessoaMae();
    cp.lavaRoupa();  // executa o método da classe CPessoaMae;
}

O quando falamos em “apenas uma chamada” queremos dizer isso aqui:

[code]package br.com.inlife.polimorfismo;

public class CPessoaTest {
public void laveAgora(CPessoa alguem) {
System.out.println(“Lavando roupas…”);
alguem.lavaRoupa();
}

public static void main(String[] args) {		
    CPessoa joanaFilha = new CPessoaFilha();
    laveAgora(joanaFilha);	
    CPessoa joanaMae = new CPessoaMae();	
    laveAgora(joanaMae);
}

}[/code]

Note que o mesmo método foi chamado, mas o comportamento do objeto “alguem” mudou nas duas chamadas, graças ao polimorfismo. Isso é importante, pois o método laveAgora irá funcionar, mesmo que uma nova classe seja inserida no futuro. A única restrição é que o método lavaRoupa() deve manter o seu significado, que é o de lavar a roupa, mesmo que a forma de fazer isso seja completamente diferente.

Se o método existe de forma genérica na classe pai e é sobrescrito nas classes filhas, sempre que o método for chamado numa instancia da classe filha a JVM vai executar o método mais específico e não o genérico. Não é preciso fazer nada além de simplesmente chamar o método, a JVM toma conta disso para o programador.

void imprimeTudo(CPessoa cp){ cp.lavaRoupa(); //apesar da referencia ser genérica o método será escolhido em tempo de execução com base na instância real do objeto. }