Menu
Coddy logo textTech

Encadeamento de Construtores

Parte da seção Programação Orientada a Objetos do Journey de Java da Coddy. Lição 23 de 87.

Encadeamento de construtores é o processo de chamar um construtor a partir de outro. Esta técnica ajuda a evitar a duplicação de código quando uma classe possui múltiplos construtores ou ao trabalhar com hierarquias de herança.

Dentro da mesma classe, você pode encadear construtores usando this(). Isso permite que você tenha um construtor "principal" que faz todo o trabalho, enquanto outros construtores simplesmente delegam para ele:

public class Rectangle {
    private int width;
    private int height;
    
    public Rectangle() {
        this(1, 1);  // Chama o construtor de dois parâmetros
    }
    
    public Rectangle(int size) {
        this(size, size);  // Cria um quadrado
    }
    
    public Rectangle(int width, int height) {
        this.width = width;
        this.height = height;
    }
}

Na herança, o encadeamento de construtores acontece automaticamente. Quando você cria um objeto de uma subclasse, o Java chama o construtor pai primeiro usando super(). Se você não chamar explicitamente super(), o Java insere super() (a versão sem argumentos) automaticamente:

public class Animal {
    private String name;
    
    public Animal(String name) {
        this.name = name;
        System.out.println("Animal constructor");
    }
}

public class Dog extends Animal {
    private String breed;
    
    public Dog(String name, String breed) {
        super(name);  // Deve ser a primeira linha
        this.breed = breed;
        System.out.println("Dog constructor");
    }
}

Criar new Dog("Buddy", "Labrador") imprime "Animal constructor" primeiro e, em seguida, "Dog constructor". Isso garante que as classes pai sejam sempre inicializadas corretamente antes que a classe filha adicione sua própria configuração.

challenge icon

Desafio

Fácil

Vamos criar um sistema de pedidos de produtos que demonstra o encadeamento de construtores tanto dentro de uma classe quanto em uma hierarquia de herança. Você verá como this() encadeia construtores na mesma classe, enquanto super() encadeia construtores da classe pai.

Você criará três arquivos para organizar seu código:

  • Product.java: Crie uma classe pai que represente qualquer produto em uma loja. Ela deve ter:
    • Campos privados para name (String) e price (double)
    • Um construtor principal que receba name e price, inicialize os campos e exiba: Product constructor: [name]
    • Um segundo construtor que receba apenas name e encadeie com o construtor principal usando this(name, 0.0) para definir um preço padrão de 0.0
    • Métodos getName() e getPrice() para acessar os campos
  • Electronics.java: Crie uma subclasse que estenda Product e adicione informações sobre a garantia:
    • Um campo privado para warrantyYears (int)
    • Um construtor principal que receba name, price e warrantyYears — use super(name, price) para inicializar a classe pai, depois defina a garantia e exiba: Electronics constructor: [warrantyYears] year warranty
    • Um segundo construtor que receba apenas name e price, encadeando com o construtor principal por meio de this(name, price, 1) para fornecer uma garantia padrão de 1 ano
    • Um terceiro construtor que receba apenas name, encadeando com o segundo construtor por meio de this(name, 0.0)
    • Um método getDetails() que retorne: [name] - $[price] ([warrantyYears] year warranty)
  • Main.java: Demonstre o encadeamento de construtores em ação. Você receberá três entradas: um nome de produto (String), o preço (double) e os anos de garantia (int). Crie um objeto Electronics usando os três parâmetros e, em seguida, exiba o resultado de getDetails().

Você receberá três entradas: o nome do produto, o preço e os anos de garantia.

Formate o preço em getDetails() para exibir 2 casas decimais usando String.format("%.2f", price). Observe atentamente a saída — você verá as mensagens dos construtores aparecerem em ordem, mostrando como o encadeamento flui da classe pai para a classe filha!

Experimente você mesmo

import java.util.Scanner;

class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        
        // Ler entradas
        String name = scanner.nextLine();
        double price = scanner.nextDouble();
        int warrantyYears = scanner.nextInt();
        
        // TODO: Criar um objeto Electronics usando todos os três parâmetros
        
        // TODO: Imprimir o resultado de getDetails()
    }
}
quiz iconTeste seus conhecimentos

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

Pratique por conta própria: Compilador de Java online