AFF Education Construa seu Futuro

☕ Java para Iniciantes

Aula 61a  |  Construtores e a palavra this

Revisão: como criamos objetos na Aula 61

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.

O que é um 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.

Um construtor é um método especial que tem exatamente o mesmo nome da classe, não declara tipo de retorno e é executado automaticamente quando você escreve new NomeDaClasse(...).

Três regras de ouro do construtor:

Sem Construtor vs Com Construtor

Veja lado a lado como a mesma classe Cliente fica de cada forma:

✘ Aula 61 — sem construtor
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;
✔ Aula 61a — com construtor
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.

A palavra this

Ao 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ódigoLeitura
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 construtor

O 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.).

Diagrama da Classe com Construtor

Na notação UML, o construtor aparece na segunda seção do diagrama, separado dos atributos por uma linha tracejada:

Cliente

String nome  atributo

double peso  atributo

double altura  atributo

int idade  atributo


Cliente(String nome, double peso, double altura, int idade)  construtor

Exemplo Completo com 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.

Construtor Padrão (Default)

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
    }
}

Resumo Comparativo

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.

🧪 Lista de Exercícios

1. Qual é a principal característica que distingue um construtor de um método comum?

2. No construtor abaixo, o que this.nome representa?

Cliente(String nome, double peso, double altura, int idade) {
    this.nome = nome;
}

3. O que acontece se você escrever nome = nome; dentro do construtor, sem usar this?

4. Dado o código abaixo, qual é o valor de c.peso após a execução?

Cliente c = new Cliente("Bruno Costa", 88.0, 1.82, 35);

5. Você criou a classe Cliente com um construtor de 4 parâmetros. Depois tenta fazer Cliente c = new Cliente();. O que acontece?

6. Qual das alternativas representa a declaração correta de um construtor para a classe Produto?

🏆 Desafio

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

Exercícios de Aplicação AFF Education

Reforce o conteúdo desta aula com mais dois exercícios práticos:

1. Qual a função de um construtor em uma classe?

2. No construtor, a palavra this normalmente serve para: