Visibilidade em Java: public, private e protected

A visibilidade, ou controle de acesso, em Java define até onde os atributos, métodos e classes podem ser acessados em um programa. Isso ajuda a proteger os dados e a controlar a forma como diferentes partes de um sistema interagem. Os principais modificadores de visibilidade são public, private e protected. Neste tutorial, vamos explorar esses modificadores e como eles afetam o acesso a elementos dentro e fora de uma classe.

1. Modificador public

Quando um atributo, método ou classe é declarado como public, ele pode ser acessado por qualquer código, em qualquer lugar do programa. Não há restrições quanto ao pacote ou classe em que está sendo utilizado.

Exemplo de atributo e método public:

class Pessoa {
    // Atributos públicos
    public String nome;
    public int idade;

    // Método público
    public void exibirInformacoes() {
        System.out.println("Nome: " + nome);
        System.out.println("Idade: " + idade);
    }
}

Acessando atributos e métodos públicos:

public class Main {
    public static void main(String[] args) {
        Pessoa pessoa = new Pessoa();

        // Acessando atributos e métodos publicamente
        pessoa.nome = "Carlos";
        pessoa.idade = 30;
        pessoa.exibirInformacoes();
    }
}

Saída:

Nome: Carlos
Idade: 30

No exemplo acima, tanto os atributos quanto o método da classe Pessoa são acessados diretamente de fora da classe porque são públicos.

2. Modificador private

O modificador private limita o acesso ao membro da classe ao escopo da própria classe. Isso significa que nenhuma outra classe, nem mesmo classes dentro do mesmo pacote, podem acessar diretamente esses atributos ou métodos.

Exemplo de atributos private:

class Pessoa {
    // Atributos privados
    private String nome;
    private int idade;

    // Método público para acessar os dados
    public void setNome(String nome) {
        this.nome = nome;
    }

    public String getNome() {
        return nome;
    }

    public void setIdade(int idade) {
        this.idade = idade;
    }

    public int getIdade() {
        return idade;
    }
}

Acessando atributos privados com métodos públicos (getters e setters):

public class Main {
    public static void main(String[] args) {
        Pessoa pessoa = new Pessoa();

        // Acessando atributos privados através de métodos públicos
        pessoa.setNome("Ana");
        pessoa.setIdade(25);

        System.out.println("Nome: " + pessoa.getNome());
        System.out.println("Idade: " + pessoa.getIdade());
    }
}

Saída:

Nome: Ana
Idade: 25

Aqui, os atributos nome e idade são privados, e o acesso a eles só é possível através dos métodos públicos setNome, getNome, setIdade e getIdade. Isso garante o encapsulamento, protegendo os dados e fornecendo um controle de como eles são modificados.

3. Modificador protected

O modificador protected permite que o membro seja acessado dentro do mesmo pacote e por classes derivadas (subclasses), mesmo que essas subclasses estejam em pacotes diferentes. Esse é o comportamento intermediário entre public e private.

Exemplo de atributos protected:

class Pessoa {
    // Atributo protegido
    protected String nome;

    // Método protegido
    protected void exibirNome() {
        System.out.println("Nome: " + nome);
    }
}

Acessando protected dentro de uma subclasse:

class Funcionario extends Pessoa {
    public void definirNome(String nome) {
        this.nome = nome;
    }

    public void exibirNomeFuncionario() {
        exibirNome();
    }
}

Testando o acesso em uma classe externa:

public class Main {
    public static void main(String[] args) {
        Funcionario func = new Funcionario();
        func.definirNome("Pedro");
        func.exibirNomeFuncionario();
    }
}

Saída:

Nome: Pedro

No exemplo acima, a classe Funcionario, que herda de Pessoa, consegue acessar o atributo nome e o método exibirNome, ambos protegidos. Esse comportamento é permitido porque Funcionario é uma subclasse de Pessoa, mesmo que esteja em um pacote diferente.

Comparação de public, private e protected

ModificadorAcesso na própria classeAcesso em subclasses (mesmo pacote)Acesso em subclasses (diferente pacote)Acesso em qualquer lugar
publicSimSimSimSim
privateSimNãoNãoNão
protectedSimSimSimNão

Conclusão

O controle de visibilidade em Java através dos modificadores public, private e protected é uma ferramenta poderosa para garantir que os dados de uma classe sejam acessados de maneira controlada e segura. Ao usar esses modificadores de forma adequada, você pode proteger os dados sensíveis e limitar o acesso apenas ao necessário, promovendo o encapsulamento e a reutilização eficiente de código.

Agora que você entende o papel desses modificadores, pode aplicá-los para organizar e proteger melhor seu código.