Aula 61a | Construtores e a palavra this
Na aula anterior criamos a classe Cliente com quatro atributos e depois instanciamos objetos atribuindo cada valor manualmente, linha por linha:
Cliente cliente1 = new Cliente(); // cria o objeto (gaveta vazia) cliente1.nome = "Ana Silva"; // preenche atributo por atributo cliente1.peso = 62.5; cliente1.altura = 1.65; cliente1.idade = 28;
Essa abordagem funciona, mas tem dois problemas:
① Verboso: para cada novo cliente você precisa repetir 4 linhas de atribuição. Com 100 clientes, são 400 linhas extras.
② Sem garantia de completude: nada impede que alguém crie um objeto e esqueça de preencher um atributo — o objeto ficaria com null ou 0 sem aviso algum.
A solução para os dois problemas é o construtor.
Um construtor é um método especial que fica dentro da classe e é chamado automaticamente pelo new no momento em que o objeto é criado. Ele serve para inicializar os atributos do objeto já na criação, garantindo que nenhum campo fique vazio por engano.
new NomeDaClasse(...).
Três regras de ouro do construtor:
void.new.Veja lado a lado como a mesma classe Cliente fica de cada forma:
public class Cliente {
String nome;
double peso;
double altura;
int idade;
// sem construtor
}
// Para criar um cliente:
Cliente c1 = new Cliente();
c1.nome = "Ana Silva";
c1.peso = 62.5;
c1.altura = 1.65;
c1.idade = 28;
public class Cliente {
String nome;
double peso;
double altura;
int idade;
// construtor
Cliente(String nome,
double peso,
double altura,
int idade) {
this.nome = nome;
this.peso = peso;
this.altura = altura;
this.idade = idade;
}
}
// Para criar um cliente:
Cliente c1 = new Cliente(
"Ana Silva", 62.5, 1.65, 28);
Com o construtor, uma única linha cria o objeto já com todos os atributos preenchidos. Sem ele, você precisa de cinco linhas para o mesmo resultado.
thisAo escrever o construtor, você vai notar que os parâmetros têm o mesmo nome dos atributos da classe:
Cliente(String nome, double peso, double altura, int idade) {
this.nome = nome; // ← qual "nome" é qual?
this.peso = peso;
this.altura = altura;
this.idade = idade;
}
Aqui entra o this. Ele é uma referência ao próprio objeto que está sendo criado. Ou seja, this.nome significa "o atributo nome deste objeto", enquanto nome sozinho é o parâmetro recebido pelo construtor.
Como ler cada linha com this:
| Código | Leitura |
|---|---|
this.nome = nome; |
O atributo nome deste objeto recebe o valor do parâmetro nome. |
this.peso = peso; |
O atributo peso deste objeto recebe o valor do parâmetro peso. |
this.altura = altura; |
O atributo altura deste objeto recebe o valor do parâmetro altura. |
this.idade = idade; |
O atributo idade deste objeto recebe o valor do parâmetro idade. |
⚠ E se eu não usar this? Se você escrever apenas nome = nome; dentro do construtor, o Java entende que você está atribuindo o parâmetro a ele mesmo — o atributo da classe não recebe nenhum valor e fica como null. this é o que garante que a atribuição vai para o lugar certo.
this fora do construtorO this não é exclusivo do construtor — pode ser usado em qualquer método da classe para se referir ao próprio objeto. Mas é no construtor que ele aparece com mais frequência, justamente porque os parâmetros costumam ter o mesmo nome dos atributos.
💡 Dica de leitura: sempre que ver this.algo, leia como "o atributo algo deste objeto". Isso torna o código mais auto-explicativo do que inventar nomes diferentes para os parâmetros (como nomeParam, n, etc.).
Na notação UML, o construtor aparece na segunda seção do diagrama, separado dos atributos por uma linha tracejada:
String nome atributo
double peso atributo
double altura atributo
int idade atributo
Cliente(String nome, double peso, double altura, int idade) construtor
Agora veja o programa completo com a classe Cliente usando construtor. Compare com a versão da Aula 61: o resultado é idêntico, mas o código do main é muito mais conciso.
public class Cliente {
String nome;
double peso;
double altura;
int idade;
// Construtor: recebe os dados e inicializa o objeto de uma só vez
Cliente(String nome, double peso, double altura, int idade) {
this.nome = nome;
this.peso = peso;
this.altura = altura;
this.idade = idade;
}
}
public class EstruturaComConstrutor {
public static final double alturaMaxima = 1.90;
public static void main(String[] args) {
// Cria os três clientes em uma única linha cada — atributos já preenchidos
Cliente cliente1 = new Cliente("Ana Silva", 62.5, 1.65, 28);
Cliente cliente2 = new Cliente("Bruno Costa", 88.0, 1.82, 35);
Cliente cliente3 = new Cliente("Carla Souza", 55.0, 1.93, 22);
// Exibe dados e verifica altura
Cliente[] clientes = {cliente1, cliente2, cliente3};
for (Cliente c : clientes) {
System.out.print(c.nome + " | Peso: " + c.peso
+ " kg | Altura: " + c.altura
+ " m | Idade: " + c.idade + ". ");
if (c.altura > alturaMaxima)
System.out.println("Altura acima da máxima.");
else
System.out.println("Altura dentro do padrão.");
}
}
}
Ana Silva | Peso: 62.5 kg | Altura: 1.65 m | Idade: 28. Altura dentro do padrão.
Bruno Costa | Peso: 88.0 kg | Altura: 1.82 m | Idade: 35. Altura dentro do padrão.
Carla Souza | Peso: 55.0 kg | Altura: 1.93 m | Idade: 22. Altura acima da máxima.
✔ Comparação direta com a Aula 61:
A saída do terminal é exatamente a mesma. A diferença está no código de criação dos objetos:
Para 100 clientes: 500 linhas vs 100 linhas.
Na Aula 61, você escreveu new Cliente() sem passar nenhum argumento — e funcionou. Por quê? Porque quando você não declara nenhum construtor, o Java cria automaticamente um construtor padrão vazio, equivalente a:
Cliente() {
// construtor padrão gerado automaticamente pelo Java
// não inicializa nada — os atributos ficam com valores padrão
// String → null | double → 0.0 | int → 0 | boolean → false
}
⚠ Atenção: assim que você declara qualquer construtor na classe, o Java para de gerar o construtor padrão automaticamente. Se você ainda quiser criar objetos com new Cliente() após adicionar um construtor com parâmetros, precisará declarar explicitamente um construtor vazio também.
public class Cliente {
String nome;
double peso;
double altura;
int idade;
// Construtor com parâmetros
Cliente(String nome, double peso, double altura, int idade) {
this.nome = nome;
this.peso = peso;
this.altura = altura;
this.idade = idade;
}
// Construtor vazio declarado explicitamente (se precisar)
Cliente() {
// deixa os atributos com valores padrão
}
}
| Aspecto | Sem Construtor (Aula 61) | Com Construtor (Aula 61a) |
|---|---|---|
| Criação do objeto | new Cliente() |
new Cliente("Ana", 62.5, 1.65, 28) |
| Linhas para criar 1 objeto | 5 linhas (1 + 4 atribuições) | 1 linha |
| Atributos obrigatórios | Não — pode esquecer algum | Sim — todos os parâmetros são exigidos |
| Valores padrão se esquecer | null, 0, false |
Não se aplica (construtor exige tudo) |
Uso do this |
Não necessário | Necessário para distinguir parâmetro de atributo |
| Quando usar | Prototipagem rápida, objetos simples | Código de produção, objetos com dados obrigatórios |
✅ O construtor é um método especial com o nome da classe e sem tipo de retorno, chamado automaticamente pelo new.
✅ Ele permite criar objetos já com todos os atributos preenchidos em uma única linha.
✅ O this.atributo refere-se ao atributo do objeto atual, distinguindo-o do parâmetro de mesmo nome.
✅ Se você declarar um construtor com parâmetros, o construtor padrão vazio deixa de existir automaticamente.
Crie uma classe Aluno com os atributos String nome, int idade, String turma e double nota. Adicione um construtor que inicialize todos os atributos via this. Em seguida, na classe principal, crie três alunos usando o construtor e imprima os dados de cada um, indicando se foi aprovado (nota ≥ 7.0) ou reprovado.
public class Aluno {
String nome;
int idade;
String turma;
double nota;
Aluno(String nome, int idade, String turma, double nota) {
this.nome = nome;
this.idade = idade;
this.turma = turma;
this.nota = nota;
}
}
public class DesafioAluno {
public static void main(String[] args) {
Aluno a1 = new Aluno("Lucas", 17, "3A", 8.5);
Aluno a2 = new Aluno("Beatriz", 16, "2B", 5.0);
Aluno a3 = new Aluno("Pedro", 18, "3A", 7.0);
Aluno[] alunos = {a1, a2, a3};
for (Aluno a : alunos) {
String resultado = a.nota >= 7.0 ? "Aprovado" : "Reprovado";
System.out.printf("%s | Turma: %s | Nota: %.1f → %s%n",
a.nome, a.turma, a.nota, resultado);
}
}
}
Saída esperada:
Lucas | Turma: 3A | Nota: 8.5 → Aprovado
Beatriz | Turma: 2B | Nota: 5.0 → Reprovado
Pedro | Turma: 3A | Nota: 7.0 → Aprovado
Reforce o conteúdo desta aula com mais dois exercícios práticos: