HOWTO · Java

Chame outro construtor em Java

Este tutorial explica como chamar um construtor de outro em Java

Em Java, a sequência de invocação de construtores na inicialização do objeto é chamada de encadeamento de construtor. É usado quando queremos invocar um construtor após o outro usando uma instância.

Chame um construtor de outro dentro da mesma classe em Java

Quando queremos chamar um construtor de outro construtor da mesma classe, usamos a palavra-chave this. Uma expressão que usa a palavra-chave this deve ser a primeira linha do construtor. A ordem não importa no encadeamento do construtor. Deve ter pelo menos um construtor que não use a palavra-chave this.

No exemplo abaixo, temos uma classe Test que possui 3 construtores. Um é o padrão sem nenhum parâmetro, enquanto os outros dois são parametrizados. No método main, instanciamos o objeto de classe com a palavra-chave new sem nenhum parâmetro passado.

Ele invoca o construtor padrão Test() que redireciona a chamada para o construtor parametrizado Test(String name) usando this("Steve"). O construtor Test(String name) redireciona ainda mais a chamada para o outro construtor parametrizado Test(int age, String place) usando this(30,"Texas").

As instruções dentro de Test(int age, String place) são executadas primeiro. Depois disso, o resto das instruções do construtor Test(String name) são executadas. Finalmente, a instrução restante do construtor padrão é executada e o objeto é inicializado com sucesso.

public class Test {
  Test() {
    this("Steve");
    System.out.println("Default Constructor");
  }
  Test(String name) {
    this(30, "Texas");
    System.out.println("Name - " + name);
  }
  Test(int age, String place) {
    System.out.println("Age- " + age + ", place- " + place);
  }
  public static void main(String[] args) {
    Test test = new Test();
  }
}

Resultado:

Age- 30, place- Texas
Name - Steve
Default Constructor

Chame um construtor de outro da classe base em Java

Quando há mais de uma classe com o relacionamento de herança, precisamos usar a palavra-chave super para chamar o construtor da classe pai da classe filha. Ao contrário da palavra-chave this, a JVM coloca automaticamente a palavra-chave super.

A classe base é a classe pai que é estendida pela classe derivada. O método main no qual instanciamos o objeto de classe invoca o construtor padrão da mesma classe, que redireciona ainda mais a chamada para o construtor parametrizado da classe filha usando this("Adam").

super(name) invoca o construtor parametrizado Base(String name) da classe Base. O construtor padrão da classe Base é invocado usando this(). A variável de classe também é inicializada aqui usando this.name = name.

O código dentro do construtor padrão da classe Base é executado. Posteriormente, as instruções dentro do construtor parametrizado Base(String name) são executadas. Finalmente, a instrução restante dentro do construtor parametrizado da classe Derived é executada.

class Base {
  String name;
  Base() {
    System.out.println("Default Constructor Base Class");
  }
  Base(String name) {
    this();
    this.name = name;
    System.out.println("Parameterized Constructor Base Class called:- " + name);
  }
}
class Derived extends Base {
  Derived() {
    this("Adam");
  }
  Derived(String name) {
    super(name);
    System.out.println("Parameterized Constructor Derived Class called: " + name);
  }
  public static void main(String[] args) {
    Derived derived = new Derived();
  }
}

Resultado:

Default Constructor Base Class
Parameterized Constructor Base Class called:- Adam
Parameterized Constructor Derived Class called: Adam