Como usar o String toString ( ) sem precisar extender classe é possivel?

Boa Tarde, Galera!

Estou voltando a estudar Java e estou tentando recordar de alguns assuntos, estou com essa situação.

class ExtratoTotal extends Contabank {
    
    public ExtratoTotal(String agencia, String contacorrente, String usuario) {
        super(agencia, contacorrente, usuario);
    }
    
    public String toString() {
        return "A Conta" + this.usuario + " " + this.agencia + " / " + this.contacorrente + "POSSUI: R$" + balanco;
    }
}

Quando Compila, sai isso dizendo:

java: unreachable statement

Onde estou errando, obrigado.

Qual a visibilidade das propriedades da classe Contabank? Esse erro acontece em qual linha?


É estranho pra mim quando vejo uma classe como ExtratoTotalherdar de Contabank. Não consigo ver um extrato ser um tipo de conta.

Geralmente o compilador informa a classe e a linha em que o erro ocorre, então comece olhando lá.

Dito isso, não tem como só esse trecho de código dar erro de unreachable statement. Provavelmente o problema está em outra parte do código.

Vou colar aqui o Codigo da Classe Contabank.java como estou codando ! Acho que assim melhora , a visibilidade esta lá como protected !

package co.javabank.bank;
import javax.swing.*;
import java.lang.*;

public class Contabank {
    private static final int MAX_LENGTH = 12;
    protected String agencia;
    protected String contacorrente;
    protected String usuario;
    private double balanco;

    private LogResultado Logador;


    public Contabank(String agencia, String contacorrente, String usuario) {
        this.agencia = agencia;
        this.contacorrente = contacorrente;
        setName(usuario);
        Logador = new LogResultado();
    }

    public void setName(String usuario) {
        if (usuario.length() > MAX_LENGTH) {
            this.usuario = usuario.substring(0, MAX_LENGTH);
        } else {
            this.usuario = usuario;
        }
        System.out.println(this.usuario);
    }

    public void depositar(double valor) {
        balanco += valor;
        Logador.SaidaLog("DEPOSITO - R$ " + valor + " Sua Conta agora e de R$" + balanco);
    }

    public boolean sacar(double valor) {
        if (balanco < valor) {
            Logador.SaidaLog("SAQUE - R$ " + valor + " Seu Saldo atual é de R$ " + balanco);
            return  false;
        } else {
            balanco -= valor;
            Logador.SaidaLog("SAQUE - R$ " + valor + " Sua Conta agora é de R$ " + balanco);
            return true;
        }
       class ExtratoTotal extends Contabank  {

           public ExtratoTotal(String agencia, String contacorrente, String usuario) {
               super(agencia, contacorrente, usuario);
           }

           public String toString(){
                return "A Conta" + this.usuario + " " + this.agencia + " / " + this.contacorrente + "POSSUI: R$" + balanco;
            }
       }
   }
}



A classe ExtratoTotal está dentro do método sacar. Por quê?

Enfim, é por isso que dá erro. Repare que antes tem um código que retorna algo (ele pode cair no if ou no else, mas em ambos os casos vai retornar algo, ou seja, vai sair do método e não vai executar mais nada do que vem depois).

Por isso a declaração da classe ExtratoTotal é um unreachable statement. É um ponto que nunca será executado, pois o método sempre retorna antes disso.

Tire a classe daí e coloque-a em um arquivo ExtratoTotal.java.

Beleza Hugo, vou tentar e volto aqui !
Valeu por ajudar !

Coloquei fiz o que você disse é compilou , mas ficou complexo o codigo, então fiz dessa forma e deu certo também. O que eu não entendia é que o String toString ele pode funcionar na propria classe sem extender você pode fazer uma sobrecarga na propria classe !
Sua sugestão !


class ExtratoTotal extends Contabank {

    public ExtratoTotal(String agencia, String contacorrente, String usuario) {
        super(agencia, contacorrente, usuario);
    }

    public String toString(){
        return "A Conta" + this.usuario + " " + this.agencia + " / " + this.contacorrente + "POSSUI: R$" + balanco;
    }

}

Melhor Solução !

public boolean sacar(double valor) {
        if (balanco < valor) {
            Logador.SaidaLog("SAQUE - R$ " + valor + " Seu Saldo atual é de R$ " + balanco);
            return false;
        } else {
            balanco -= valor;
            Logador.SaidaLog("SAQUE - R$ " + valor + " Sua Conta agora é de R$ " + balanco);
            return true;
        }


    }
    @Override
    public String toString() {
        return "A Conta" + this.usuario + " " + this.agencia + " / " + this.contacorrente + "POSSUI: R$" + balanco;
    }

}


Isso ai ! ainda falta alguns detalhes aqui mas estou descobrindo !

O método toString é da classe Object, que todas as classes herdam de forma implícita.

https://docs.oracle.com/javase/10/docs/api/java/lang/Object.html

1 curtida

E só reiterando o que já foi dito acima, não faz sentido ExtratoTotal herdar de Contabank.

Um extrato não é uma conta. Um extrato é um conjunto de informações que você pode extrair de uma conta.

Então a classe Contabank poderia ter um método extrato (ou obterExtrato, getExtrato, informacoesExtrato, etc) que mostra as informações dela (e aí nem precisaria da outra classe).

Ou então a classe ExtratoTotal tem um método (mostrarExtrato, etc) que recebe uma conta e mostra as informações dela. Algo assim:

public class ExtratoTotal {
    public void mostrarExtrato(Contabank conta) {
        System.out.printf("A conta %s %s / %s possui R$ %.2f\n", conta.getUsuario(), conta.getAgencia(), conta.getContaCorrente(), conta.getBalanco());
    }
}
2 curtidas