3
respostas

DIFERENÇA CÓDIGO E AULA:

Boa tarde,

no instante 08:59 da aula, podemos ver que ao implementar o método:

getValorImposto  na classe ContaCorrente

Nico insere:

return super.saldo * 0.01;

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Porém no meu código deu errado... Após bastante insistência, tive que utilizar o seguinte comando:

public double getValorImposto() {
    return super.getSaldo() * 0.01;
}

utilizando o getSaldo(), chamando um método...

Não consegui entender o porquê o meu só funcionou assim e teve esta diferença, visto que os códigos estão iguais....

Atenciosamente.

3 respostas

Bom dia, Wagner. Precisaria ver o seu código em que essa sua classe Conta Corrente está estendendo. Provavelmente na classe conta onde existe o "saldo", no seu código esse atributo deve estar private, por isso que você não está conseguindo acessar igual ao Nico. Pesquisa sobre modificadores de acesso (private, default, protected e public).

Então, será porque na Classe Conta, o saldo está privado? tendo que chamar pelo método?

Segue a classe Conta Corrente:


public class ContaCorrente extends Conta implements Tributavel{

    public ContaCorrente(int agencia, int numero){
        super(agencia, numero);
        //passa para a classe no seu construtor específico
    }

    @Override
    public boolean saca(double valor){
        double valorASacar = valor + 0.2;
        return super.saca(valorASacar);
        //taxa de 20 centavos no saque
    }

    @Override
    public double getValorImposto() {
        return super.getSaldo() * 0.01;
    }
}

e a Classe Conta:



public abstract class Conta {

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

    public Conta(int agencia, int numero) {
        Conta.total ++;

        this.agencia = agencia;
        this.numero = numero;
        //this.saldo = 100;
        //System.out.println("Criando uma conta.");
    }


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

    public boolean saca(double valor) { 
        if(this.saldo >= valor) {
            this.saldo -= valor;
            System.out.println("Saque realizado com sucesso.");
            return true;
        } else {
            System.out.println("Saque não realizado.");
            return false;
        }
    }

    public boolean transfere(double valor, Conta destino) {
        if(this.saca(valor)) {
                destino.deposita(valor);
                return true;
        } else {
            return false;
        }
    }

    //SALDO ------------------
    public double getSaldo() {
        return this.saldo;
    }
    //NUMERO ------------------    
    public int getNumero() {
        return this.numero;
    }
    public void setNumero(int numero) {
        if(numero <= 0) {
            System.out.println("Não pode valor menor que 0.");
            return;
        }
        this.numero = numero;
    }
    //AGENCIA ------------------     
    public int getAgencia() {
        return this.agencia;
    }
    public void setAgencia(int agencia) {
        if(agencia <= 0) {
            System.out.println("Não pode valor menor que 0.");
            return;
        }
        this.agencia = agencia;
    }
    //TITULAR ------------------
    public void setTitular(Cliente titular) {
        this.titular = titular;
    }
    public Cliente getTitular() {
        return titular;
    }
    //TOTAL --------------------
    public static int getTotal() {
        return Conta.total;
    }
}

Normalmente, quando você coloca "private" nos seus atributos, você tem que gerar um método getter para trazer a informação desse seu atributo e o setter para você modificar a informação desse atributo, assim, você trabalhar com o conceito de encapsulamento. Se você for na classe Conta e trocar o private do saldo por public ou protected você irá conseguir acessar igual o Nico fez no vídeo.

private

* O atributo só pode ser acessado dentro dessa mesma classe.
* Precisa gerar os getters e setters para acessar fora dessa classe.

default

* O atributo com "default" só pode ser acessado dentro do mesmo pacote.
* Não pode ser acessado por outra classe fora desse mesmo pacote (Está redundante, mas é só pra reforçar).

protected

* O atributo pode ser acessado dentro do mesmo pacote.
* O atributo só pode ser acessado fora do pacote se ele estiver herdando da classe pai.
O exemplo da ContaCorrente herdando de Conta.

public

* O atributo pode ser acessado diretamente dentro do mesmo pacote e fora também, sem regras.

Eu passei em ordem de restrição. Quando não colocamos nenhum desses modificadores explicitamente, por padrão vai ser o "default" no atributo.