3
respostas

[Dúvida] Sobre construtor

Foi mostrado duas formas de construir um construtor por exemplo:

Construtor 1: Para os atributos da propria classe

   public Aluno(String nome, int idade, int matricula, String curso) {
        this.matricula = matricula;
        this.curso = curso;
    }

Construtor 2: Invocando a superclasse para passar os valores aos atributos dela

  public Aluno(String nome, int idade) {
        super(nome, idade);
    }

Minha duvida é possível fazer um construtor que misture essas duas formas de declaração, ou seja, uma parte ele se referencia a superclasse e a outra a ela mesma é errado isto e porque?

     public Aluno(String nome, int idade, int matricula, String curso) {
        super(nome, idade);
        this.matricula = matricula;
        this.curso = curso;
    }
3 respostas

Oi, tudo bem?

Essa forma que você usou:

public Aluno(String nome, int idade, int matricula, String curso) {
        super(nome, idade);
        this.matricula = matricula;
        this.curso = curso;
    }

Acontece que Aluno é uma subclasse, por exemplo, de uma classe Pessoa:

public class Pessoa {
private String nome;
private int idade;

public Pessoa(String nome, int idade) {
this.nome = nome;
this.idade = idade;
}

Em Java, quando a superclasse possui atributos, é obrigatório você inicializar os atributos dela quando cria um construtor para a subclasse. Isso é feito para manter a consistência dos dados, pois imagine, não ia fazer sentido você ter nome e idade inicializados com algum valor somente na subclasse se nome e idade na superclasse permanecem vazios, porque o nome e idade da subclasse são herdados da superclasse. Sacou?

Se você não chamar explicitamente super() em um construtor da subclasse, o compilador tentará inserir uma chamada ao construtor padrão(construtor vazio) da superclasse automaticamente. No entanto, isso só funcionará se a superclasse tiver um construtor sem parâmetros. Se a superclasse não tiver um construtor sem parâmetros, você deve chamar explicitamente um dos seus construtores que aceita parâmetros.

Oi agradeço a sua explicação mas a minha duvida não é sobre ter um construtor na subclasse, com atributos da mãe (super classe), e sim se é possível criar um construtor igual o que deixei de exemplo, onde uso para passar valores para a super classe, e também posso usar um atributo da subclasse para passar pro construtor, considerando o exemplo de aluno que tem nome, idade e Matricula, em muito momentos vão ser pedidos os 3 dados juntos.

Oi Matheus,

Sim, é perfeitamente possível criar um construtor que misture essas duas formas de declaração. O que você apresentou como exemplo está correto e é uma prática comum em Java. No seu caso, o construtor que você escreveu:

public Aluno(String nome, int idade, int matricula, String curso) {
    super(nome, idade);
    this.matricula = matricula;
    this.curso = curso;
}

Esse construtor chama o construtor da superclasse (provavelmente uma classe Pessoa com os atributos nome e idade) usando super(nome, idade), e, em seguida, inicializa os atributos da própria classe Aluno (matricula e curso) usando this.

A ordem das chamadas é importante: você deve sempre chamar super(...) como a primeira linha do construtor. Ao fazer isso, você garante que a parte da superclasse seja inicializada antes da parte da subclasse.

Aqui está um exemplo completo para ilustrar:

class Pessoa {
    String nome;
    int idade;

    public Pessoa(String nome, int idade) {
        this.nome = nome;
        this.idade = idade;
    }
}

class Aluno extends Pessoa {
    int matricula;
    String curso;

    public Aluno(String nome, int idade, int matricula, String curso) {
        super(nome, idade);
        this.matricula = matricula;
        this.curso = curso;
    }
}

Neste exemplo, a classe Aluno herda de Pessoa e combina os construtores conforme você descreveu. Portanto, sua abordagem está correta e funcional.

tux matrix    Caso este post o tenha ajudado, por favor, marcar como solucionado ☑️. Bons Estudos! 🤓