Bom dia, O metodo fazerSaque dentro da classe SistemaBancario não saca o valor passado no parametro. O metodo fazerSaque chama o metodo saca() da classe ContaCorrente, mas nao efetua o saque.
Classe conta generica
package SISTEMABANCARIO;
public abstract class Conta{
protected int numeroConta;
protected double saldo;
protected Cliente cliente;
protected String tipoConta;
public abstract void deposita(double valor);
public abstract void saca(double quantidade);
//public abstract void imprimirInfo();
public Conta(){
}
public Conta(int numeroConta, double saldo, String tipoConta ) {
this.numeroConta = numeroConta;
this.saldo = saldo;
this.tipoConta = tipoConta;
//this.cliente = titular;
}
public double getSaldo() {
return saldo;
}
}
Classe ContaCorrente
package SISTEMABANCARIO;
public class ContaCorrente extends Conta{
//private double limiteCredito;
//private double taxaJuros;
public ContaCorrente(int numeroConta, double saldo, String tipoConta){
super(numeroConta, saldo, tipoConta);
}
public ContaCorrente() {
}
public void gerarTaxa() {
super.saldo = super.saldo - 15.99;
}
@Override
public void deposita(double valor) {
super.saldo = super.saldo + valor;
}
@Override
public void saca(double quantidade) {
double novoSaldo = super.saldo - quantidade;
super.saldo = novoSaldo;
}
@Override
public String toString() {
return "\nNumero da Conta: "+super.numeroConta+"\nSaldo: "+super.saldo+
"\nTipo de Conta: "+super.tipoConta+"\n*************************************\n";
}
public Cliente getCliente() {
return cliente;
}
public void setCliente(Cliente cliente) {
this.cliente = cliente;
}
}
Classe SistemaBancario com o metodo fazerSaque
package SISTEMABANCARIO;
public class SistemaBancario {
public void fazerSaque(Cliente cliente, double valor){ // COMO EU FAÇO PARA QUE O SAQUE DESTE METODO
ContaCorrente c = new ContaCorrente();
//c.saca(valor);
c.saca(valor);
System.out.println("Saque efetuado com sucesso!");
}
}
Testei seu código e o saque foi efetuado corretamente.
Eu só modifiquei um pouco a classe SistemaBancario
, adicionei um println(c)
para ver os dados da conta e um método main()
para poder testar. Ficou assim:
package SISTEMABANCARIO;
public class SistemaBancario {
public void fazerSaque(Cliente cliente, double valor) { // COMO EU FAÇO PARA QUE O SAQUE DESTE METODO
ContaCorrente c = new ContaCorrente();
c.saca(valor);
System.out.println(c);
System.out.println("Saque efetuado com sucesso!");
}
public static void main(String[] args) {
new SistemaBancario().fazerSaque(null, 10);
}
}
E no console, mostrou que o saldo é -10, como esperado, já que o saldo era 0.0.
Me explica melhor o problema que vc encontrou.
1 curtida
Tinha faltado enviar o main, por isso vc nao viu pq nao sacou.
Veja no meu main ai porque nao sacou. Quando eu coloco sis.fazerSaque(3), não é sacado
sis.fazerSaque(3); // aqui nao saca
Segue a Classe main TesteSistema.java, veja observe
package SISTEMABANCARIO;
public class TesteSistema {
public static void main(String[] args) {
Cliente c1 = new Cliente();
c1.setNome("Maria");
c1.setEndereco("Rua sao João");
c1.setTelefone(3214566);
c1.setLimiteCredito(10000);
c1.setId(1);
Cliente c2 = new Cliente();
c2.setNome("Jose");
c2.setEndereco("Rua sao Lucas");
c2.setTelefone(9223);
c2.setLimiteCredito(20000);
c2.setId(2);
Cliente c3 = new Cliente();
c3.setNome("Carlos");
c3.setEndereco("Bairro cidade de Deus");
c3.setTelefone(12928);
c3.setLimiteCredito(450000);
c3.setId(3);
Cliente c4 = new Cliente();
c4.setNome("Beijamin");
c4.setEndereco("Centro João Pessoa");
c4.setTelefone(837780);
c4.setLimiteCredito(2500000);
c4.setId(4);
Conta contaCorrente = new ContaCorrente(3457, 8,"** Conta corrente **");
Conta contaPoupanca = new ContaPoupanca(7878, 5,"** Conta Poupança**");
SistemaBancario sis = new SistemaBancario();
sis.cadastrarCliente(c1, contaCorrente);
//sis.cadastrarCliente(c2, contaPoupanca);
//sis.cadastrarCliente(c3, contaPoupanca);
//sis.cadastrarCliente(c4, contaCorrente);
System.out.println(sis.getLista());
sis.fazerSaque(3); // aqui nao saca
//contaCorrente.saca(4);
System.out.println(contaCorrente.getSaldo());
//sis.cadastrarCliente(c2, contaPoupanca);
System.out.println("\n");
//System.out.println(sis.getClientes()); // nao imprime a lista de clientes
//System.out.print(c2.getNome());
//contaCorrente.imprimirInfo();
//contaCorrente.imprimirInfo();
//System.out.print(sis.getClientes());
//System.out.println(sis.toString());
}
}
O metodo fazerSaque ficou assim classe completa
package SISTEMABANCARIO;
import java.util.ArrayList;
import java.util.List;
public class SistemaBancario {
List<Conta> contas;
List<Cliente> clientes;
List<ContaPoupanca> contaPoupancas;
List<ContaCorrente> contaCorrentes;
//private Cliente cliente;
private List <Object> lista = new ArrayList<Object>();
private ContaCorrente c;
public SistemaBancario(){
this.clientes = new ArrayList <Cliente>();
this.contas = new ArrayList <Conta>();
this.contaCorrentes = new ArrayList<ContaCorrente>();
this.contas = new ArrayList<Conta>();
this.contaPoupancas = new ArrayList<ContaPoupanca>();
c = new ContaCorrente();
}
public void removerConta(Conta conta) {
this.contas.remove(conta);
}
public void cadastrarCliente(Cliente cliente, Conta conta) {
this.lista.add(cliente);
this.lista.add(conta);
//this.clientes.add(cliente);
//this.contas.add(conta);
}
public void fazerSaque(double valor){ // COMO EU FAÇO PARA QUE O CLIENTE SAQUE DESTE METODO
c.saca(valor);
}
public List<Cliente> getClientes() {
for(Cliente c: clientes){
c.toString();
}
return clientes;
}
public List<ContaCorrente> getContaCorrentes() {
return contaCorrentes;
}
public List<ContaPoupanca> getContaPoupancas() {
return contaPoupancas;
}
public List<Object> getLista() {
//System.out.print(lista.get(1));
//System.out.print(lista.get(0));
//System.out.print(lista.get(0));
//for(Object ob: lista){
// System.out.print(lista.get(0));
//System.out.print(c);
//}
return lista; // retorna o toString da lista(Cliente e Conta)
}
}
No constructor da classe SistemaBancario
vc cria uma nova instância de ContaCorrente
e é desta instância que o saque é realizado.
No seu métodos main
, vc tem esta linha:
sis.cadastrarCliente(c1, contaCorrente);
E acredito que sua intenção é fazer o saque da consta cadastrada neste trecho, correto? Isso nunca acontece no seu código, vc vai ter que alterar sua lógica.
E se o método fazerSaque()
tiver um outro parâmetro numeroDaConta
e aí vc faz uma busca no seu array de contas para ver se o tal número existe. Se existir, vc faz o saque dela.
1 curtida
Não diretamente relacionado, mas fica a sugestão de criar um construtor que receba todos os dados de uma vez (que nem vc fez com a Conta
).
E não é só pra “digitar menos”, tem a questão semântica também. Por exemplo, se vc faz new Cliente()
cria um cliente sem nome, endereço, id, etc. Faz sentido existir um cliente sem nenhuma dessas informações? Se não fizer, melhor deixar apenas o construtor que recebe todos os dados e só cria o cliente se tudo estiver válido.
1 curtida
Não amigo, a minha intenção é fazer o saque deste trecho de codigo abaixo
Conta contaCorrente = new ContaCorrente(3457, 8,"** Conta corrente **");
Mas o saque não é realizado com o metodo fazerSaque()
dentro da classe SistemaBancario
. Qual a sugestão que voce daria para esta questao? ficar sacando direto da conta corrente ou poupança através do metodo saca(double quantidade)
, dessa forma quando eu chamo no main este metodo saca normalmente assim contaCorrente.saca)// Aqui saca
.
Consegui amigo, nao estava sacando porque nao estava fazendo referencia a conta, entao tinha que passar a conta como parametro e o valor a ser sacado da conta, ficou assim o metodo fazerSaque(Conta conta, double quantia)
no main ficou assim sis.fazerSaque(contaCorrente,3); // agora saca
Gratidão pelas sugestões e respostas
1 curtida