Dúvida em código sobre herança, polimorfismo

Bom dia, estou dando uma olhada na apostila da Caelum e nos exercícios do Capítulo 7, me surgiu a dúvida se eu estou fazendo corretamente.Sei que a galera aqui do fórum não gostam de gente que vem pedir exercício pronto, mas eu gostaria se alguém pudesse dar uma olhada para indicar erros, porque se eu aprender errado será mais difícil de corrigir futuramente.

Os exercícios do capítulo 7 são sobre herança, polimorfismo…Fiquem com dúvida se fiz corretamente os métodos getSaldoTotal.

Códigos:

ContaCorrente.java

public class ContaCorrente extends Conta{
	public void atualiza(double taxa)
	{
		this.saldo *= (2 * taxa);
	}
	
	public void deposita(double valor)
	{
		this.saldo += valor * 0.9962;
	}

}

ContaPoupanca.java

public class ContaPoupanca extends Conta{
	public void atualiza(double taxa)
	{
		this.saldo *= (3 * taxa);
	}

}

Conta.java

public class Conta {
	protected double saldo;
	
	public void deposita (double valor)
	{
		this.saldo += valor;
	}
	
	public void saca (double valor)
	{
		if (valor < saldo)
		{
			System.out.printf("Você sacou %d", valor);
			this.saldo -= valor;
		}
		
		else
			System.out.println("Você não possui saldo suficiente.");
	}
	
	public double getSaldo()
	{
		return this.saldo;
	}
	
	public void atualiza (double taxa)
	{
		this.saldo = this.saldo * taxa;
	}
	
	
}

AtualizadorDeContas.java

public class AtualizadorDeContas {
	private static double saldoTotal = 0;
	private double selic;
	
	AtualizadorDeContas(double selic)
	{
		this.selic = selic;
	}
	
	public void roda(Conta c)
	{
		//saldo anterior
		System.out.println(c.getSaldo());

		//atualiza conta
		c.atualiza(0.01);
		
		//saldo final
		System.out.println(c.getSaldo());
		
		this.saldoTotal += c.getSaldo(); 
	}
	
	public double getSaldoTotal ()
	{
		return this.saldoTotal;
	}

}

Para testar a aplicação estou usando

Programa.java

public class Programa {
	public static void main(String args[])
	{
		AtualizadorDeContas teste = new AtualizadorDeContas(0.01);
		
		Conta c = new Conta();
		ContaCorrente cc = new ContaCorrente();
		ContaPoupanca cp = new ContaPoupanca();
		
		c.deposita(1000);
		cc.deposita(1000);
		cp.deposita(1000);
		
		teste.roda(c);
		teste.roda(cc);
		teste.roda(cp);
		
		System.out.println("Saldo Total: " + teste.getSaldoTotal());
		
	}

}

A galera não gosta é quando vc vem com o enunciado e só quer a resposta… :slight_smile:

Mas do jeito que vc fez, tudo bem. Eu só não te respondo pq não tenho o livro!

vc tem erro?

então escreve para gente…

Erro eu não tenho só tinha achado o resultado estranho, mas aqui tinha feito errado uma coisa.

Substitui:

this.saldo *= (3 * taxa);  

Por:

this.saldo += this.saldo * taxa * 3; 

E também
Substitui:

this.saldo *= (2 * taxa);  

Por:

this.saldo += this.saldo * taxa * 2;

Desculpem o tópico desnecessário, agora só da uns avisos, mas vou dar uma pesquisada na internet sobre esses avisos.

tá igual o da apostila nao tá?

pelo que deu pra perceber está tudo correto.

Isso não tem nada a haver com herança.
Por outro lado, essas expressões não são equivalentes.

seja taxa = 5, saldo = 2
primeira expressão = 30
segunda expressão = 32

A expressão equivalente à primeira que não usa o operador simplificado é

this.saldo = this.saldo * taxa * 3; 

blz Pessaol,

to no mesmo problema da apostila que o super zica e ja tinha desistido deste AtualizadorDeContas mas vi a persistencia do cara em aprender certo e decidi avançar.

meus numeros finais tao esquisitos, acho que o saldo do Arbelardo ta inconsistente assim como outros numero.
ja mudei/verifiquei o codigos varias vezes inclusive a diferenca de remuneraçao do metodo atualiza(); para as conta basica, poupanca e conta corrente, mas nada :roll:

na verdade to um pouco confuso e me perdi no labirinto de oo e herançe e agradeço por ajuda;

o codigo ta um pouco extenso, mas fazer o que neh :slight_smile:

muito obrigado!

a classe Cliente

class Cliente {

	protected String nome;
	protected String sobrenome;
	protected String cpf;
	private int idade;

	public void mudaCPF(String cpf)	{
		if	(this.idade <= 60)	{
			validaCPF(cpf);
		}
		this.cpf = cpf;
	}

	private void validaCPF(String cpf)	{
		// serie de regras aqui, falha caso nao seja valido
	}

	// ..
}

a Conta

class Conta {

  private static int totalDeContas;
  protected int numero;
  public double saldo;
  protected double limite;
  protected Cliente titular;
  
  public void atualiza(double valor)	{
	  this.saldo += this.saldo * valor;
	  System.out.println("remuneração selic  + " + getSaldo() * valor);
  }
	  
  public void transfere(Conta destino, double valor) {
	if (valor > this.saldo + this.limite)	{
		System.out.println("Erro! saldo de " + getSaldo() + " inferior a transferencia " + valor);
		} else {
			this.saldo -= valor;
			destino.saldo += valor;
			System.out.println("transferencia - " + valor);
	}
}


  public Conta(Cliente titular, int numero, double limite)	{
	  this.limite = limite;
	  this.titular = titular;
	  this.numero = numero;
  }

  Conta() {
  Conta.totalDeContas = Conta.totalDeContas + 1;
  }
  public int getTotalDeContas() {
  return Conta.totalDeContas;
	}

  public double getSaldo() {
      return this.saldo + this.limite;
  }

  public Cliente getTitular()	{
	  return this.titular;
  }
  
  public double getLimite()	{
	  return this.limite;
	  }

  public void setTitular(Cliente titular)	{
	  this.titular = titular;
  }

  public void deposita(double valor)	{
	  if	(valor > 0)	{
	  this.saldo += valor;
	  System.out.println("depósito + " + valor);
	  } else {
		  System.out.println("valor negativo nao aceito");
		  }
		  }

  public void saca(double valor)	{
	  if (valor > this.saldo + this.limite)	{
		  System.out.println("Erro. saque de " + valor + " superior ao saldo " + this.getSaldo());
	  }	else {
		  this.saldo -= valor;
		  System.out.println("saque - " + valor);
		  }
  }
  public void mostra ()	{
	  System.out.println("conta nº " +this.numero);
	  System.out.println("titular " +this.titular.nome);
   	  System.out.println("limite + " +getLimite());
  	  System.out.println("===================================");
  	  }


}

a conta corrente

class ContaCorrente	extends Conta	{

	public ContaCorrente(Cliente titular, int numero, double limite)	{
		  super.limite = limite;
		  this.titular = titular;
		  this.numero = numero;
	  }
	
	public void atualiza(double valor)	{
		this.saldo += this.saldo * (valor * 1.5);
		}

	public void deposita(double valor)	{
		this.saldo += valor - 0.10;
	
	}
}

a Poupanca

class ContaCorrente	extends Conta	{

	public ContaCorrente(Cliente titular, int numero, double limite)	{
		  super.limite = limite;
		  this.titular = titular;
		  this.numero = numero;
	  }
	
	public void atualiza(double valor)	{
		this.saldo += this.saldo * (valor * 1.5);
		}

	public void deposita(double valor)	{
		this.saldo += valor - 0.10;
	
	}
}

o AtualizadorDeContas

public class AtualizadorDeContas	{
	protected double saldoTotal = 0;
	protected double selic;

	AtualizadorDeContas(double selic)	{
		this.selic = selic;
	}

	public void roda(Conta c)	{
		// aqui voce imprime o saldo anterior, atualiza a conta,
		// e depois imprime o saldo final
		// lembrando de somar o saldo final ao atributo saldoTotal
		
		System.out.println("saldo anterior + " + c.getSaldo());
			
		c.atualiza(selic);
	
		System.out.println("saldo total + ");
		System.out.println(this.saldoTotal += c.getSaldo());
		
	// outros métodos, colocar o getter para saldoTotal!
		}
	// usei o println anterior pois nao preciso ficar com varios get, eu acho::??
		public double getSaldoTotal()	{
		return this.saldoTotal;
		}
	
	
}

	

o main

class Principal	{

	public static void main(String[] args)	{

		Cliente felipe 		= new Cliente();
		Cliente ze 			= new Cliente();
		Cliente marcos 		= new Cliente();
		Cliente manuel 		= new Cliente();
		Cliente abelardo 	= new Cliente();

		
		felipe.nome 	= "Felipe";
		ze.nome 		= "Zé";
		marcos.nome 	= "Marcos";
		manuel.nome		= "Manuel";
		abelardo.nome	= "Aberlardo";
		

		Conta minhaConta 	= new Conta();
		Conta minhaConta2 	= new Conta();
		Conta minhaConta3 	= new Conta();
		
		
		minhaConta 			= new Conta(marcos,				1,1000.0);
		minhaConta2 		= new Conta(ze,					2,1000.0);
		minhaConta3 		= new Conta(felipe,				3,1000.0);
		
		Conta cc			= new ContaCorrente(manuel,		4,1000.0);
		Conta cp			= new ContaPoupanca(abelardo,	5,1000.0);
		
		AtualizadorDeContas atc = new AtualizadorDeContas(0.05);


		minhaConta.deposita(1000.0);
		minhaConta.saca(100.0);
		minhaConta.transfere(minhaConta,500.0);
		atc.roda(minhaConta);
		minhaConta.mostra();
	

		minhaConta2.deposita(100.0);
		minhaConta2.saca(200.0);
		minhaConta2.transfere(minhaConta3,3000.0);
		atc.roda(minhaConta2);
		minhaConta2.mostra();
		

		minhaConta3.deposita(555.0);
		minhaConta3.saca(190.0);
		minhaConta3.transfere(minhaConta,140.0);
		atc.roda(minhaConta3);
		
		
		cc.deposita(1450.0);
		cc.saca(150.0);
		cc.transfere(minhaConta,150.0);
		atc.roda(cc);
		cc.mostra();

		
		cp.deposita(150.0);
		cp.saca(150.0);
		cp.transfere(cc,130.0);
		atc.roda(cp);
		cp.mostra();
	
		
		System.out.println("total de contas " + minhaConta.getTotalDeContas());
		}
}

a saida de tela

depósito + 1000.0
saque - 100.0
transferencia - 500.0
saldo anterior + 1900.0
remuneração selic  + 97.25
saldo total + 
1945.0
conta nº 1
titular Marcos
limite + 1000.0
===================================
depósito + 100.0
saque - 200.0
Erro! saldo de 900.0 inferior a transferencia 3000.0
saldo anterior + 900.0
remuneração selic  + 44.75
saldo total + 
2840.0
conta nº 2
titular Zé
limite + 1000.0
===================================
depósito + 555.0
saque - 190.0
transferencia - 140.0
saldo anterior + 1225.0
remuneração selic  + 61.8125
saldo total + 
4076.25
saque - 150.0
transferencia - 150.0
saldo anterior + 2149.9
saldo total + 
6312.3925
conta nº 4
titular Manuel
limite + 1000.0
===================================
depósito + 150.0
saque - 150.0
transferencia - 130.0
saldo anterior + 870.0
saldo total + 
7169.3925
conta nº 5
titular Aberlardo
limite + 1000.0
===================================
total de contas 5