Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

Eu não estou conseguindo chamar uma método, na classe principal, dentro de outro método:

Este é meu método main:

public class TestaEndereco extends Conta{
    public static void main(String[] args) {

        Conta c1 = new Conta();
            c1.agencia = "abc123";
            c1.numero = "123456789";
            c1.deposita(100);    
        c1.titular = new Cliente();
            c1.titular.nome = "Pablo de Abreu";
            c1.titular.cpf = "029.082.853-80";
            c1.titular.profissao = "Programador";
        c1.titular.endereco = new Endereco();
            c1.titular.endereco.cidade = "Teresina";
            c1.titular.endereco.bairro = "São Cristovão";
            c1.titular.endereco.cep = "64.000";
            c1.titular.endereco.complemento = "Apto. 603";
            c1.titular.endereco.logradouro = "Av. Área Leão";
            c1.titular.endereco.numero = "575";

        Conta c2 = new Conta();
            c2.agencia = "abc123";
            c2.numero = "123654987";
            c2.deposita(500);
        c2.titular = new Cliente();
            c2.titular.nome = "Felipe Brasileiro";
            c2.titular.cpf = "015.025.858-89";
            c2.titular.profissao = "Estudante";
        c2.titular.endereco = new Endereco();
            c2.titular.endereco.cidade = "Teresina";
            c2.titular.endereco.bairro = "Joquei";
            c2.titular.endereco.cep = "64.000";
            c2.titular.endereco.complemento = "casa 1";
            c2.titular.endereco.logradouro = "Rua Ribamar Pacheco";
            c2.titular.endereco.numero = "575";

            c1.titular.dadosPessoais();
    }
}

O metodo dadosPessoais() está dentro da classe Cliente, segue a classe Cliente:

public class Cliente extends Conta {
    public String nome;
    public String cpf;
    public String profissao;
    public Endereco endereco;
        for (int i = 0; i < this.nome.length() + 14 + this.cpf.length() + 13 ; i++) {
            System.out.print("=");
        }
        System.out.println();

        System.out.print("|| O cliente: " + this.nome + " com CPF: " + this.cpf + " ||" + "\n" + "|| " +
                "Com profissão de: " + this.profissao);
    for (int i = 0; i < this.nome.length() + 14 + this.cpf.length() + 13 - this.profissao.length() 
                    - 23 ; i++) {
            System.out.print(" ");
        }
        System.out.println("||");
    for (int i = 0; i < this.nome.length() + 14 + this.cpf.length() + 13 ; i++) {
            System.out.print("=");
        }

        System.out.println();
    int tamanhoBarraDeCima = this.nome.length() + this.cpf.length() + 14 + 13;

        this.endereco.imprimeEndereco(tamanhoBarraDeCima);
        this.dadosDaConta(tamanhoBarraDeCima);

    }    
}

O método imprimeEndereco() está na classe Endereco, segue a classe endereco:

```

3 respostas

Segue a Classe Conta:

public class Conta {
    double saldo;
    String agencia;
    String numero;
public Cliente titular;
public void deposita(double valor) {
        this.saldo += valor;
    }
public boolean saca(double valor) {
        if (this.saldo >= valor) {
            this.saldo -= valor;
            System.out.println("Você sacou " + valor + " Seu saldo atual é: " + this.saldo);
            return true;
        } else {
            System.out.println("Você não tem saldo sulficiente, tente um valor menor! Seu saldo é: "
        + this.saldo);
            return false;
        }
    }
public boolean transfere(double valor, Conta destino) {
        if(this.saldo >= valor) {
            this.saldo -= valor;
destino.deposita(valor);
            System.out.println(this.titular + " Transferiu: " + valor + "R$ para conta de: " 
            + destino.titular + ". Seu saldo atual é: " + this.saldo + "R$.");
            return true;
        } else {
            System.out.println("Não foi possivel fazer a tranfeência de: " + valor + "R$ para conta de: " +
                    destino.titular 
                    + ", seu saldo é insulficiente: " + this.saldo + "R$.");
            System.out.println("Tente um valor menor!");
            return false;
        }
    }
public void dadosDaConta(int tamanhoBarraDeCima) {

        for (int i = 0; i < tamanhoBarraDeCima; i++) {
            System.out.print("=");
        }
        System.out.print("\n" + "|| " + "Sua Agência é: " + this.agencia + " E Seu Número: " + this.numero);
        for (int i = 0; i < tamanhoBarraDeCima - (3); i++) {
            System.out.print(" ");
        }

        System.out.println();

        if(this.saldo >= 0) {
            System.out.println("Tem Saldo Positivo de: " + this.saldo);
        } else {
            System.out.println("tem Saldo Negativo de: " + this.saldo);
        }
    }
}

Segue o problema:

Quando rodo a classe TestaEndereco ele faz a seguinte impressão:

=======================================================
|| O cliente: Pablo de Abreu com CPF: 029.082.853-80 ||
|| Com profissão de: Programador                     ||
=======================================================
=======================================================
|| mora na cidade: Teresina no bairro: São Cristovão ||
|| Na Rua(Avenida): Av. Área Leão No Número: 575     ||
|| Complemento: Apto. 603 CEP: 64.000                ||
=======================================================
|| Sua Agência é: null E Seu Número: null                                                    
Tem Saldo Positivo de: 0.0

Ou seja, o método dadosDaConta() é o único que não seta os valores corretamente, agencia e numero ficam null e saldo em 0;

Porém se eu chamo o método diretamente em TestaEndereco funciona corretamente.

solução!

Eu consegui resolver assim: Na classe TestaEndereco não chamei mas o método, da classe Cliente, dadosPessoais() passei a chamar o método na classe principal Conta dadosDoCliente(), antigo método dadosDaConta(). Segue alteração em Conta:

public void dadosDoCliente() { //Esse método que se chama dadosDaConta() se chamará dadosDoCliente()        

        this.titular.dadosPessoais(); //Chamando o método dadosPessoais();        

        for (int i = 0; i < this.titular.tamanhoBarra; i++) {
            System.out.print("=");
        }
        System.out.print("\n" + "|| " + "Sua Agência é: " + this.agencia + " E Seu Número: " + this.numero);
        for (int i = 0; i < this.titular.tamanhoBarra - (3); i++) {
            System.out.print(" ");
        }

        System.out.println();

        if(this.saldo >= 0) {
            System.out.println("Tem Saldo Positivo de: " + this.saldo);
        } else {
            System.out.println("tem Saldo Negativo de: " + this.saldo);
        }
    }

Segue alteração em Cliente:

//Criei a variavel tamanhoBarra; para armazenar o valor da barra e poder ser pego em Conta;
int tamanhoBarra;

public void dadosPessoais() {
for (int i = 0; i < this.nome.length() + 14 + this.cpf.length() + 13 ; i++) {
            System.out.print("=");
        }
        System.out.println();

        System.out.print("|| O cliente: " + this.nome + " com CPF: " + this.cpf + " ||" + "\n" + "|| " +
                "Com profissão de: " + this.profissao);
for (int i = 0; i < this.nome.length() + 14 + this.cpf.length() + 13 - this.profissao.length() 
                    - 23 ; i++) {
            System.out.print(" ");
        }
        System.out.println("||");
for (int i = 0; i < this.nome.length() + 14 + this.cpf.length() + 13 ; i++) {
            System.out.print("=");
        }

        System.out.println();
int tamanhoBarraDeCima = this.nome.length() + this.cpf.length() + 14 + 13;

        tamanhoBarra = tamanhoBarraDeCima;        

        this.endereco.imprimeEndereco(tamanhoBarraDeCima);
        //this.titular.dadosDaConta(tamanhoBarraDeCima);

    }

Achei essa forma de resolução, mas porque não consegui da forma anterior? E como seria para fazer funcionar da forma anterior?

Oi Pablo. As boas práticas de programação recomendam que as variáveis tenham seu encapsulamento como private:

private double saldo;
private String agencia;
private String numero;

Dessa forma seus dados estão protegidos de manipulação indevida.

Variáveis private são acessadas através de métodos getter (obter o valor) e setter (definir o valor):

    public double getSaldo() {
        return saldo;
    }

    public void setSaldo(double saldo) {
        this.saldo = saldo;
    }

    public String getAgencia() {
        return agencia;
    }

    public void setAgencia(String agencia) {
        this.agencia = agencia;
    }

    public String getNumero() {
        return numero;
    }

    public void setNumero(String numero) {
        this.numero = numero;
    }

Quando uma variável String retorna com valor null significa que o seu valor não foi inicializado.