Herança + Poliformismo duvida :?:

Pessoall…

To com a seguinte duvida.

Analisando o s códigos

conta.java

public class conta{
	private double saldo;
	//construtor
	public conta(double deposito){
		setSaldo(deposito);
	}
	
	public double getSaldo(){
		return saldo;
	}
	
	protected void setSaldo(double d){
		if (d > 0){
			this.saldo = d;
		}else{
			geraErro(0);
		}
	}
}

Criei uma descendente poupanca.java

public class poupanca extends conta{
	private double txJuros;
	
	public poupanca(double deposito,double juros){
		super(deposito);
		this.txJuros = juros;
	}

	protected void setJuros(){
		setSaldo((getSaldo() *txJuros/100)+getSaldo());
	}	
	
	public double getSaldo(){		
		//só para ilustrar
		return 2000;
	}
}

na main testeConta.java fiz o seguinte

[code]
public class testConta{

public static void main(String args[]){
	conta c1 = new poupanca(5000,2.2);
	System.out.println(c1.getSaldo());
}	

}[/code]

Minha dúvida é pq não posso fazer c1.setJuros();
E quando chamo o metodo getSaldo() ele chama o metodo da class filha ?

É uma duvida meio conceitual sobre poliformismo (acho que é isso)…

tkz…

:smiley:

nspy,

Não consegues acessar, porque o método setJuros é do filho e tais dizendo que o teu objeto é do tipo do pai, no caso Conta.

conta c1 = new poupanca(5000,2.2);

:slight_smile:

Imagine que você tem uma classe base(conta no caso), ela não tem um método setJuros().
Você herdou conta e criou uma poupança… até ai ok.

agora:

conta c1 = new poupanca(); c1.setSaldo(5454); // OK! c1.setJuros(4); // OPA!

mas com c1 você só vai poder chamar os métodos que existem na classe conta… (que poderiam ser sobreescritos na classe poupanca). Mesmo possuindo um objeto poupanca!

uma dica, por padrão as classe começam com a primeira letra maiuscula!
faça “Conta” e “Poupanca”

entenda o seguinte o metodo setJuros() so existe na subclass ele nao existe na superclass… vc criou um objeto c1, que é do tipo da superclass e é um objeto da subclass, onde vai chamar todos os metodos subscritos da superclass, e setJuros()nao pertence a superclass entao vc nao pode chamar aquilo que a superclass nao conhece… ja que o relacionamento ai entre as classes chama-se É-UM. E você criou um objeto com esse tipo de relacionamento.
E o fato que o retorno ser da class filha de getSaldo() é pq o metodo foi subscrito na subclasse e vc tem um objeto que vai chamar os metodos que foi subscrito da superclass… por isso o resultado é da class filha… um exemplo um pouco mais claro veja:

class Carro{
public void cor(){System.out.println("sem cor");}
}
class Ferrari extends Carro{
public void cor(){System.out.println("azul");}
public void placa(){}
}
class Vendas{
Carro c = new Ferrari();
c.cor();//aqui ele vai chamar o da subclasse e imprimir azul
c.placa();// isso nem compila minha superclass nao tem o metodo placa.
}

espero ter ajudado :smiley:

Obrigado!

Entendi sim…

Estou lendo o livro POO em 21 dias fiquei com esta dúvida…

Agradeço a todos

tkz :smiley:

so uma dica… se as respostas atendeu sua duvida… edita ele para [resolvido]… é uma forma de manter as mensagem do topico mais organizada blz?