Fundamentos do Java: Orientação a objetos
- #Java
Neste artigo, você vai entender não só o "como usar", mas principalmente o "por que usar" os conceitos fundamentais da programação orientada a objetos (OOP) em Java.
Vamos explicar com o mesmo exemplo de código, passo a passo, tudo sobre:
- Classe e Objeto
- Método
- Método Estático
this
: o que é e por que usar- Encapsulamento: o que significa segurança de verdade
record
: dados imutáveis
Cenário: um sistema de vendas
Imagine um sistema que cadastra produtos com nome e preço. Vamos usar esse exemplo em tudo.
1. Classe e Objeto: o molde e a forma
O código
public class Produto {
String nome;
double preco;
}
O que é isso?
A classe é o molde.
O objeto é a forma real criada a partir desse molde.
Produto p1 = new Produto(); // Criando um produto na memória
p1.nome = "Caderno";
p1.preco = 19.90;
Por que isso é útil?
Imagine uma fábrica de produtos. A classe é o projeto no papel. O objeto é o produto pronto na sua mão.
Você pode criar quantos objetos quiser com uma única classe. Cada um guarda seus próprios dados.
2. Método: comportamento do objeto
public class Produto {
String nome;
double preco;
void exibir() {
System.out.println(nome + " custa R$" + preco);
}
}
O que é?
Um método é uma ação que o objeto pode fazer.
Produto p1 = new Produto();
p1.nome = "Caderno";
p1.preco = 19.90;
p1.exibir(); // Caderno custa R$19.9
Por que usar?
Porque você centraliza a lógica em um só lugar. Não precisa repetir System.out.println(...)
toda vez.
3. this
: por que precisamos disso?
Imagine que você tem isso dentro da classe:
public void setNome(String nome) {
this.nome = nome;
}
Mas por que usar this.nome
?
O nome do parâmetro do método é o mesmo do atributo da classe.
Sem o this
, o Java acha que você está atribuindo a variável a ela mesma.
Sem this
:
public void setNome(String nome) {
nome = nome; // erro lógico
}
Aqu,i na realidade, temos duas variáveis chamada nome, o nome que vem como parametro da função setNome, e o nome que existe dentro desse objeto, para indicar que queremos alterar a variável que está vindo como parametro, usamos somente nome. E para indicar que queremos alterar a variável dentro deste objeto, usamos this.nome.
Com this
:
this.nome = nome; // Agora sim: salva o valor no atributo da classe
O que é this
?
É uma referência ao próprio objeto.
Ou seja, ele diz: "estou falando do atributo que pertence a este objeto que estou usando agora".
4. Encapsulamento: por que "esconder" os atributos?
Vamos ver um código sem encapsulamento:
Produto p1 = new Produto();
p1.preco = -10.00; // Isso é um preço válido? Claro que não!
O problema:
Sem nenhuma regra, qualquer parte do sistema pode colocar um valor errado ou perigoso no produto. Isso é falta de segurança.
Agora com encapsulamento:
public class Produto {
private String nome;
private double preco;
public void setPreco(double preco) {
if (preco > 0) {
this.preco = preco;
}
}
public double getPreco() {
return this.preco;
}
}
O que mudou?
private
: ninguém de fora pode alterar diretamente os dados.setPreco
: agora você controla o que entra no atributo.getPreco
: você permite leitura, mas não qualquer alteração.
Por que isso é mais seguro?
Porque você impõe regras de negócio. Você diz: “o preço só pode ser positivo”.
Ninguém mais no sistema consegue furar essa regra. Isso evita bugs e dados inválidos.
Sem encapsulamento:
- Um programador desatento altera o valor diretamente.
- Um ataque ou erro preenche valores absurdos.
Com encapsulamento:
- Você tem controle total do que pode ou não acontecer com os dados.
5. Método Estático: se já temos métodos normais, pra que isso?
Vamos ver:
public class Produto {
static void mostrarRegras() {
System.out.println("O produto deve ter nome e preço maior que zero.");
}
}
Uso:
Produto.mostrarRegras();
Diferença:
- Método normal: precisa de um objeto (ex:
p1.exibir()
). - Método estático: pertence à classe, e não precisa de objeto.
Quando usar?
- Regras gerais
- Utilitários
- Mensagens ou validações comuns
Pontos positivos:
- Acesso direto e rápido
- Não depende de criação de objeto
Pontos negativos:
- Não pode acessar atributos normais da classe
- Não pode usar
this
- Serve só para lógicas genéricas, sem estado do objeto
6. record
: quando os dados são imutáveis por padrão
O que é?
Um record
em Java é uma forma moderna e automática de criar classes imutáveis — ou seja, classes cujos dados não podem ser modificados após a criação.
Ele foi introduzido no Java 14 como preview e se tornou estável no Java 16+.
Exemplo:
java
CopiarEditar
public record Produto(String nome, double preco) {}
Uso:
Produto p1 = new Produto("Caneta", 2.50);
System.out.println(p1.nome()); // saída: Caneta
System.out.println(p1.preco()); // saída: 2.5
Você não precisa criar getters, nemtoString()
, nemequals()
manualmente. Orecord
já cria tudo isso para você automaticamente.
Por que usar?
- Quando você precisa apenas armazenar dados (como configurações, respostas de API, etc.)
- Quando não quer permitir alterações nesses dados depois da criação
- Quando quer deixar o código mais limpo e conciso
Pontos positivos:
- Imutável por padrão — os dados não podem ser modificados
- Gera automaticamente:
- Construtor
- Getters (
nome()
,preco()
) equals()
,hashCode()
,toString()
- Código muito mais enxuto
- Ótimo para modelos de leitura (como objetos de retorno)
Pontos negativos:
- Não permite alteração de dados (não tem
setters
) - Não pode herdar de outras classes (mas pode implementar interfaces)
- Não serve para lógica complexa, regras de negócio ou métodos que alteram atributos
- Só funciona no Java 14+ com
--enable-preview
, e sem preview a partir do Java 16+
Curiosidade técnica:
Os campos de um record
são implicitamente private final
. Isso significa que:
- São acessados apenas por leitura
- Não podem ser modificados
- E são parte do contrato de identidade do objeto (
equals
ehashCode
consideram todos os campos)
Quando usar record
?
Use quando:
- Você está lidando com dados que não precisam ser alterados
- Quer um objeto seguro e imutável
- Precisa de um modelo rápido para transportar dados
Exemplos:
- Modelos de retorno de API
- Representação de configurações
- Resultado de consultas
Resumo
- Use
this
para garantir que você está alterando o dado certo do objeto. - Use encapsulamento para proteger regras de negócio e manter dados válidos.
- Use métodos estáticos para utilidades gerais, que não dependem de objetos.
- Use
record
quando só precisa guardar dados de forma segura e imutável.
Gostou do artigo?
Deixe sua dúvida sugestão ou elogio nos comentários e vamos conversar !
Não esqueça de me seguir para não perder as novas publicações sobre tecnologia, desenvolvimento de software e inteligência artificial.
Vamos nos conectar? Veja meu LinkedIn 🚀