Create and overload constructors; differentiate between default and user defined constructors

Em Java, é possível criar construtores sobrecarregados e diferenciar entre construtores padrão (sem argumentos) e construtores definidos pelo usuário. Aqui estão exemplos que demonstram esses conceitos:

Construtores Sobrecarregados:

public class ExemploConstrutores {
    public static void main(String[] args) {
        // Criando instâncias usando construtores sobrecarregados
        Carro carro1 = new Carro("Toyota", "Camry", 2022);
        Carro carro2 = new Carro("Honda", "Civic");

        // Exibindo informações dos carros
        carro1.exibirInformacoes();
        carro2.exibirInformacoes();
    }
}

class Carro {
    String marca;
    String modelo;
    int ano;

    // Construtor com todos os parâmetros
    Carro(String marca, String modelo, int ano) {
        this.marca = marca;
        this.modelo = modelo;
        this.ano = ano;
    }

    // Construtor com marca e modelo (ano é atribuído um valor padrão)
    Carro(String marca, String modelo) {
        // Chamando o construtor sobrecarregado com todos os parâmetros
        this(marca, modelo, 0); // 0 é o valor padrão para ano
    }

    // Método para exibir informações do carro
    void exibirInformacoes() {
        System.out.println("Carro: " + marca + " " + modelo + " " + ano);
    }
}

Neste exemplo, a classe Carro possui dois construtores sobrecarregados: um que aceita todos os parâmetros (marca, modelo e ano) e outro que aceita apenas marca e modelo. O segundo construtor chama o primeiro, fornecendo um valor padrão (0) para o ano.

Diferenciação entre Construtores Padrão e Definidos pelo Usuário:

public class ExemploConstrutoresPadrao {
    public static void main(String[] args) {
        // Criando instâncias usando construtores
        Pessoa pessoa1 = new Pessoa(); // Construtor padrão
        Pessoa pessoa2 = new Pessoa("João", 25); // Construtor definido pelo usuário

        // Exibindo informações das pessoas
        pessoa1.exibirInformacoes();
        pessoa2.exibirInformacoes();
    }
}

class Pessoa {
    String nome;
    int idade;

    // Construtor padrão (sem argumentos)
    Pessoa() {
        // Atribuindo valores padrão
        nome = "Sem Nome";
        idade = 0;
    }

    // Construtor definido pelo usuário
    Pessoa(String nome, int idade) {
        // Atribuindo valores fornecidos como argumentos
        this.nome = nome;
        this.idade = idade;
    }

    // Método para exibir informações da pessoa
    void exibirInformacoes() {
        System.out.println("Pessoa: " + nome + ", Idade: " + idade);
    }
}

Neste exemplo, a classe Pessoa possui um construtor padrão (sem argumentos) que atribui valores padrão aos membros e um construtor definido pelo usuário que aceita nome e idade como parâmetros.

Ao criar uma instância da classe, você pode optar por usar o construtor padrão (se existir) ou um construtor definido pelo usuário, dependendo das suas necessidades. Os construtores padrão são criados automaticamente apenas se nenhum construtor for especificado na classe.