Why is the "private" access modifier letting me change the attribute outside the class?

Asked

Viewed 101 times

3

Well, I have this class with the attributes private

class Conta {
        int numero; // Atributo
        private double saldo;
        Cliente user = new Cliente();
        private double limite; }

From what I understood of the private modifier I should only be able to change the balance and the limit through the class, with a method, but this does not occur here:

    conta minhaConta = new conta();
    minhaConta.user.nome = "Marcelo Dos Santos";
    minhaConta.user.cpf = "12F";
    minhaConta.numero = 123;
    minhaConta.saldo = 1000; // Define o saldo
    minhaConta.limite = 1000;
    minhaConta.deposita(100);
    minhaConta.saca(0);
    minhaConta.saldo = 10; // Altera o saldo fora da classe mesmo com private
    System.out.println(minhaConta.saldo); // Retorna 10 e não 1000

Why does this happen?

Complete code:

public class ExerciciosConta {
    public static void main(String[] args) {
        class Cliente {
            String cpf;
            String nome;
        }

        class conta {
            int numero; // Atributo
            private double saldo;
            Cliente user = new Cliente();
            private double limite;

            void saca (double quantidade) {
                if(quantidade <= this.saldo) {
                    this.saldo -= quantidade;
                    System.out.println("R$" + quantidade + " retirados com sucesso! Seu saldo atual é de: R$ " + this.saldo);
                } else {
                    System.out.println("Sem saldo suficiente para o saque.");
                }
            }
            void deposita(double quantidade) {
                if(this.saldo + quantidade <= this.limite) {
                    this.saldo += quantidade;
                    System.out.println("R$" + quantidade + " depositados com sucesso! Seu saldo atual é de: R$ " + this.saldo);
                }else {
                    System.out.println("Você não pode depositar esta quantidade de dinheiro, pois irá atingir o limite da conta. Você pode depositar R$" + (this.limite - this.saldo));
                }
            }

            boolean transfere(conta destino, double valor) {
                if(this.saldo >= valor) {
                    this.saldo -= valor;
                    destino.saldo += valor;
                    System.out.println("Transferência de R$" + valor + " realizada com sucesso! Seu saldo atual é de: R$ " + this.saldo);
                    return true;
                } else {
                    System.out.println("Seu saldo é de: R$ " + this.saldo + ". Você não tem saldo para essa transferência!");
                    return false;
                } 

            }
        }
        Cliente clienteUm = new Cliente();
        clienteUm.nome = "Marcelo dos Santos Cardoso";
        clienteUm.cpf = "12F";

        Cliente clienteDois = new Cliente();
        clienteDois.nome = "Marcio de Sá";
        clienteDois.cpf = "13F";

        conta minhaConta = new conta();
        minhaConta.user.nome = "Marcelo Dos Santos";
        minhaConta.user.cpf = "12F";
        minhaConta.numero = 123;
        minhaConta.saldo = 1000; // Define o saldo
        minhaConta.limite = 1000;
        minhaConta.deposita(100);
        minhaConta.saca(0);
        minhaConta.saldo = 10; // Altera o saldo de fora da classe
        System.out.println(minhaConta.saldo); // Retorna 10 e não 1000


        conta contaDoOutro = new conta();
        contaDoOutro.user.nome = "Marcio De Sá";
        contaDoOutro.user.cpf = "13F";
        contaDoOutro.saldo = 2000;
        contaDoOutro.numero = 132;
        contaDoOutro.limite = 5000;

        contaDoOutro.transfere(minhaConta, 3000);

        System.out.println(minhaConta.user.cpf);

    }
}

1 answer

8


It’s simple, the code mixes things that are different. You put one class inside the other, then it gets access. Only this is wrong, the classes must be separated according to what you want. What you have done is what is called Inner class, which aims precisely to share the state between the outermost class and the innermost class. This is useful for a very specific pattern, which is not what you want. Create the classes separately and you will get the result you search for. That is, create Conta and Cliente out of ExerciciosConta which is only a utilitarian class.

Browser other questions tagged

You are not signed in. Login or sign up in order to post.