O que é encapsulamento?
Na programação orientada a objetos, encapsulamento é manter os dados de um objeto e os métodos que trabalham com esses dados juntos em uma única unidade, geralmente uma classe, e esconder os detalhes internos para que o resto do código só possa usar o objeto por meio dos seus métodos públicos.
Atualizado em 24 de setembro de 2026
Imagine que um aplicativo de banco guarda o saldo de cada conta em uma variável comum. Qualquer linha em qualquer lugar do programa pode escrever account.balance = -500, e nada impede isso. Quando um saldo negativo aparece em produção, você precisa procurar no código inteiro todos os lugares que mexeram nele. O encapsulamento resolve isso: o saldo só pode mudar por meio de alguns métodos, e esses métodos garantem as regras, por exemplo que um saque nunca pode ser maior que o saldo.
Como o encapsulamento funciona
O encapsulamento combina duas ideias:
- Agrupamento. Os dados (o saldo) e o código que trabalha com eles (depositar, sacar) ficam na mesma classe.
- Ocultação. O resto do código vê só a interface pública da classe. Os dados por trás dela são internos, então só podem mudar das formas que a classe permite.
A regra que a classe protege se chama invariante: aqui, "o saldo nunca é negativo". Como toda alteração passa pelos métodos da classe, a invariante se mantém não importa o que o resto do programa faça.
70
refused: not enough money
O código de fora consegue ler acct.balance, mas a propriedade não tem setter, então acct.balance = 1000 lança um AttributeError. Se o saldo estiver errado algum dia, há exatamente dois métodos para investigar.
Encapsulamento em Python
O Python não tem a palavra-chave private. Ele depende de convenções de nomes que todo programador Python conhece:
name: público, faz parte da interface._name: interno. Nada impede você de lê-lo, mas o sublinhado inicial diz "não dependa disto".__name: o Python o renomeia dentro da classe (name mangling), para que uma subclasse não o sobrescreva por acidente.@property: transforma um método em algo que se lê como um atributo, para que você possa acrescentar verificações depois sem mudar nenhum código que o chama.
0
False
42
O name mangling evita acidentes, não o acesso: o nome modificado continua funcionando. O Python confia que os programadores respeitem o sublinhado. Na prática, a maior parte do código Python usa um único sublinhado mais @property, e reserva os dois sublinhados para classes feitas para ter subclasses. Há mais sobre como escrever classes na documentação de classes em Python.
Encapsulamento em Java, C++ e JavaScript
Outras linguagens garantem a ocultação. Em Java, um campo private só pode ser usado dentro da própria classe:
public class BankAccount {
private int balance; // hidden from every other class
public int getBalance() { return balance; }
public void withdraw(int amount) {
if (amount > balance) throw new IllegalArgumentException("not enough money");
balance -= amount;
}
}
Escrever account.balance = 1000; em outra classe não compila: o javac informa balance has private access in BankAccount.
| Linguagem | Membro oculto | Membro público | Garantido por |
|---|---|---|---|
| Python | _name, __name | name | Convenção |
| Java | private int name | public int name | O compilador |
| C++ | seção private: | seção public: | O compilador |
| JavaScript | #name | name | O motor de JavaScript |
O C++ torna os membros de class privados por padrão e os de struct públicos. Os campos privados # do JavaScript, adicionados no ES2022, não podem ser lidos de fora da classe de jeito nenhum. A documentação cobre cada um: modificadores de acesso em Java, especificadores de acesso em C++ e campos privados em JavaScript.
Por que o encapsulamento importa
- As regras ficam em um só lugar. A verificação "nenhum saque acima do saldo" é escrita uma vez, dentro de
withdraw, em vez de antes de cada saque do programa. - Você pode mudar o interior à vontade. Se decidir guardar o dinheiro em centavos inteiros em vez de um float, só a classe muda. O código que chama
deposit(100)continua funcionando. - Depuração mais fácil. Quando um valor está errado, os suspeitos são os poucos métodos que podem alterá-lo, não todas as linhas do programa.
- Menos para aprender e testar. Uma classe com três métodos públicos pode ser entendida e testada por meio desses três métodos.
O encapsulamento também funciona acima do nível das classes. Um módulo que expõe duas funções e mantém dez auxiliares internas é encapsulado do mesmo jeito, assim como um sistema operacional que só deixa os programas abrirem arquivos por meio de chamadas de sistema.
Ele é muitas vezes confundido com abstração. A abstração decide o que a interface oferece; o encapsulamento protege os dados por trás dela. A página de abstração tem uma comparação completa lado a lado. Junto com o polimorfismo e a herança, eles são os quatro pilares da programação orientada a objetos.
Erros comuns
- Um getter e um setter para cada campo. Um
setBalanceque aceita qualquer número não protege nada. Ofereça as operações de que o objeto precisa (withdraw), não acesso direto a cada campo. - Devolver objetos internos. Um método que devolve
self._itemsentrega a quem chama a lista real, que agora pode ser alterada. Devolva uma cópia ou uma tupla. - Tratar privado como segurança. Modificadores de acesso evitam erros, não ataques. Código Java consegue ler campos privados por reflexão, e código Python consegue ler
_namediretamente. Senhas e chaves precisam de proteção de verdade, como hashing e criptografia.
Próximos passos
Leia a seguir abstração, que cobre a diferença entre as duas ideias, e depois polimorfismo. O curso de Python constrói classes passo a passo, e o curso de Java mostra o encapsulamento garantido pelo compilador.
Perguntas frequentes
O que é encapsulamento em termos simples?
deposit e withdraw, que primeiro verificam as regras. O nome vem de cápsula, um invólucro que mantém o conteúdo lá dentro.Quais são exemplos de encapsulamento?
deposit e withdraw é o exemplo clássico. A própria list do Python é outro: você chama append e nunca gerencia a memória que guarda os itens. Um módulo que expõe algumas funções e mantém as funções auxiliares privadas é encapsulamento em uma escala maior.Quais são os três tipos de encapsulamento?
Como funciona o encapsulamento em C++?
private e oferece funções membro public que os leem ou alteram. Os membros de uma class são privados por padrão, enquanto os membros de uma struct são públicos por padrão. O compilador rejeita qualquer código fora da classe que tente usar um membro privado.