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

Sobrecarga De Atributos

O professor explicou perfeitamente em relação a sobrecarga de métodos, mas enquanto ele estava falando isso me surgiu a seguinte dúvida:"E possível se ter uma sobrecarga de métodos?". Fui testar e quando fiz na classe mãe um atributo igual ao da classe pai(no caso o atributo saldo), o compilador disse o seguinte:"O campo oculta outro campo". E quando o código é executado o valor do atributo usando o this, fica zerado.

4 respostas

Oi Matheus, manda aqui o código que você estou, por favor? Assim podemos ver e já te explicamos o porque do comportamento. :)

Classe Conta

public abstract class Conta {

    protected double saldo;
    private int agencia;
    private int numero;
    private Cliente titular;
    private static int total;

    public Conta(int agencia, int numero) {
        Conta.total++;
        System.out.println("Quantidade de contas ja cadastradas: "+Conta.total);
        if ((agencia <= 0) && (numero <= 0)) {
            System.out.println("Numero de agencia ou numero de conta invalido");
        } else {
            this.agencia = agencia;
            this.numero = numero;
        }

    }

    public abstract void deposita(double valor);

    public boolean saque(double valor) {
        if (this.saldo >= valor) {
            this.saldo = this.saldo - valor;
            System.out.println("Saque realizado com sucesso");
            return true;
        } else {
            System.out.println("O valor digitado é maior do que o saldo atual "
                    + "da conta");
            return false;
        }
    }

    public boolean transfere(double valor, Conta destino) {
        if (this.saldo >= valor) {
            destino.deposita(valor);
            this.saque(valor);
            System.out.println("Transferência realizada com sucesso");
            return true;
        } else {
            System.out.println("O valor do saldo atual da conta é menor que o valor de"
                    + " transferência");
            return false;
        }

    }

    public double getSaldo() {
        return this.saldo;

    }

    public int getNumero() {
        return this.numero;
    }

    public void setNumero(int numero) {
        if (numero > 0) {
            this.numero = numero;
        } else {
            System.out.print("Numero invalido");
        }
    }

    public void setAgencia(int agencia) {
        if (agencia > 0) {
            this.agencia = agencia;
        } else {
            System.out.println("Numero invalido");

        }
    }

    public int getAgencia() {
        return this.agencia;
    }

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

    public Cliente getTitular() {
        return this.titular;
    }
    public static int getTotal(){
    return Conta.total;

    }
}

Classe ContaCorrente

public class ContaCorrente extends Conta{

    int saldo = 25;


    public ContaCorrente(int agencia, int numero){
    super(agencia , numero);
    }

    @Override
    public boolean saque(double valor) {
        double valorASacar = valor + 0.2;
        return super.saque(valorASacar); 
    }

    @Override
    public void deposita(double valor) {
        this.saldo = this.saldo +  valor;    
    }

}

Como dito anteriormente, eu tentei ver o que acontecia quando eu tentava "sobrescrever um atributo", que nesse caso e o atributo saldo, só que quando usamos esse código ,na parte do atributo aparece um aviso dizendo:"O campo oculta outro campo". Alem disso ao tentar executar o método depositar por exemplo o valor do saldo fica 0 e não sai disso. Com isso gostaria de saber por que não sai desse 0 e o por que desse aviso.

Opa Matheus!

Neste caso, acontece um "sombreamento" mesmo! Cada classe tem sua variável e acessa ela.

No caso acontece o seguinte: Quando você chama o deposita() ele até faz o que você espera, deixando o atributo saldo da ContaCorrente com os valores depositados.

Só que quando chamamos o getSaldo(), como ele está na classe Conta ele acaba pegando o saldo da Conta mesmo, que tem 0 como valor padrão.

Realmente são duas variáveis nesse caso, e você acaba com os dois valores pra gerenciar. :(

Faz sentido?

Abraço!

solução!

Ok. Completo sentido. Obrigado.