Como chamar um metodo de outra classe em java?

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