Visão Geral dos Níveis de Acesso
Parte da seção Programação Orientada a Objetos do Journey de Java da Coddy — lição 10 de 87.
Modificadores de acesso controlam de onde campos e métodos podem ser acessados. O Java possui quatro níveis de controle de acesso.
| Modificador | Mesma Classe | Mesmo Pacote | Subclasse | Em todos os lugares |
|---|---|---|---|---|
private | Sim | Não | Não | Não |
| padrão (sem palavra-chave) | Sim | Sim | Não | Não |
protected | Sim | Sim | Sim | Não |
public | Sim | Sim | Sim | Sim |
public class BankAccount {
private double balance; // Apenas esta classe
String accountType; // Padrão: apenas o mesmo pacote
protected String owner; // Mesmo pacote + subclasses
public String bankName; // Acessível em qualquer lugar
}private é o mais restritivo - use-o para dados internos que nunca devem ser acessados diretamente. public é o mais aberto - use-o para métodos que outras classes precisam chamar.
Quando você não especifica nenhum modificador, o Java usa o acesso default (também chamado de package-private). Isso permite o acesso apenas dentro do mesmo pacote.
class Helper { // Classe de acesso padrão
void assist() { } // Método de acesso padrão
}Escolha o nível de acesso mais restritivo que ainda permita que seu código funcione. Isso protege seus dados e torna seu código mais fácil de manter.
Desafio
FácilVamos construir um sistema de registro de Student que demonstra como os modificadores de acesso controlam a visibilidade em diferentes arquivos.
Você criará dois arquivos para organizar seu código:
Student.java: Defina uma classe Student com campos usando diferentes níveis de acesso:- Campo
private:studentId(String) - acessível apenas dentro da classe Student - Campo padrão (sem modificador):
grade(int) - acessível dentro do mesmo pacote - Campo
protected:name(String) - acessível no mesmo pacote e subclasses - Campo
public:school(String) - acessível em qualquer lugar
publicchamadogetInfo()que retorne uma string no formato:"[studentId] name - Grade grade at school"- Campo
Main.java: Crie um objeto Student e demonstre quais campos podem ser acessados diretamente de fora da classe. Imprima o camposchooldiretamente e, em seguida, imprima o resultado degetInfo()para mostrar todas as informações do aluno.
Você receberá quatro entradas: studentId, name, grade e school (nessa ordem).
Sua saída deve ter duas linhas: o nome da escola acessado diretamente, seguido pelas informações completas do aluno do método getInfo().
Folha de consulta
Modificadores de acesso controlam de onde campos e métodos podem ser acessados. O Java possui quatro níveis de controle de acesso:
| Modificador | Mesma Classe | Mesmo Pacote | Subclasse | Em qualquer lugar |
|---|---|---|---|---|
private | Sim | Não | Não | Não |
| default (sem palavra-chave) | Sim | Sim | Não | Não |
protected | Sim | Sim | Sim | Não |
public | Sim | Sim | Sim | Sim |
public class BankAccount {
private double balance; // Apenas esta classe
String accountType; // Padrão: apenas no mesmo pacote
protected String owner; // Mesmo pacote + subclasses
public String bankName; // Acessível em qualquer lugar
}private é o mais restritivo - use-o para dados internos que nunca devem ser acessados diretamente. public é o mais aberto - use-o para métodos que outras classes precisam chamar.
Quando você não especifica nenhum modificador, o Java usa o acesso default (também chamado de package-private), que permite o acesso apenas dentro do mesmo pacote:
class Helper { // Classe de acesso padrão
void assist() { } // Método de acesso padrão
}Escolha o nível de acesso mais restritivo que ainda permita que seu código funcione. Isso protege seus dados e torna seu código mais fácil de manter.
Experimente você mesmo
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// Ler as entradas
String studentId = scanner.nextLine();
String name = scanner.nextLine();
int grade = Integer.parseInt(scanner.nextLine());
String school = scanner.nextLine();
// TODO: Criar um objeto Student com os valores de entrada
// TODO: Imprimir o campo school diretamente (acessível porque é public)
// TODO: Imprimir o resultado de getInfo() para mostrar todas as informações do aluno
}
}
Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
Todas as lições de Programação Orientada a Objetos
1Fundamentos de POO
Arquivos ExternosIntrodução à POOClasses vs ObjetosA Palavra-chave thisMétodosCampos (Atributos)Método ConstrutorSobrecarga de ConstrutorRecapitulação - Calculadora Simples4Herança
Herança Básica (extends)A Palavra-chave superSobrescrita de Método (@Override)Encadeamento de ConstrutoresA Classe ObjectHerança Simples e MultinívelPor que não há Herança Múltipla de ClassesRecapitulação - Hierarquia de Funcionários7Métodos Especiais e a Classe Object
Método toString()equals() e hashCode()Método clone()compareTo() e ComparableInterface ComparatorRecapitulação - Ordenação Personalizada2Modificadores de Acesso e Encapsulamento
Visão Geral dos Níveis de AcessoMétodos Getter e SetterOcultação de InformaçõesA Palavra-chave finalRecapitulação - Gerenciador de Conta Bancária5Polimorfismo
Fundamentos de Sobrecarga de MétodosSobrescrita de Métodos (Tempo de Execução)Upcasting e DowncastingO Operador instanceofClasses e Métodos AbstratosRecapitulação - Calculadora de Formas8Conceitos Avançados de OOP
Composição vs HerançaAgregação vs ComposiçãoClasses Internas, Aninhadas e AnônimasEnums e Métodos de EnumRecords (Java 16+)Classes Seladas (Java 17+)11Padrões de Projeto Parte 1
Introdução aos Padrões de ProjetoPadrão SingletonPadrão FactoryPadrão BuilderPadrão ObserverPadrão Strategy3Propriedades de Classe e Membros Estáticos
Variáveis de Instância vs EstáticasMétodos EstáticosBlocos EstáticosConstantes (static final)Recapitulação - Contador e Utilitário6Interfaces e Classes Abstratas
Introdução às InterfacesImplementando InterfacesImplementação de Múltiplas InterfacesDefault e Static em InterfacesClasses Abstratas vs InterfacesInterfaces FuncionaisRecapitulação - Sistema de Pagamento9Generics
Introdução a GenericsClasses GenéricasMétodos GenéricosParâmetros de Tipos DelimitadosWildcards (?, extends, super)Recapitulação - Container Genérico12Padrões de Projeto Parte 2
Padrão CommandPadrão AdapterPadrão DecoratorPadrão Template MethodPadrão StatePadrão CompositePadrão Iterator