Вызывать один конструктор из другого в java

Это был вопрос, заданный в интервью. Можно ли назвать один конструктор из другого, если класс имеет несколько конструкторов в java и когда? Как я могу назвать синтаксис?

Ответ 1

Вы можете, и синтаксис, который я знаю,

this(< argument list >);

Вы также можете вызвать конструктор супер класса через

super(< argument list >);

Оба этих вызова могут быть выполнены только в качестве первого оператора в конструкторе (так что вы можете вызывать только один конструктор и прежде чем что-либо еще сделать).

Ответ 2

Да, вы можете это сделать.

Посмотрите на реализацию ArrayList, например:

public ArrayList(int initialCapacity) {
    super();
    if (initialCapacity < 0)
        throw new IllegalArgumentException("Illegal Capacity: "+
                                           initialCapacity);
    this.elementData = new Object[initialCapacity];
}

/**
 * Constructs an empty list with an initial capacity of ten.
 */
public ArrayList() {
    this(10);
}

Второй конструктор вызывает первый с default capacity из десяти.

Ответ 3

Ни один из ответов не является полным, поэтому я добавляю этот, чтобы заполнить пробелы.

Вы можете вызвать один конструктор из другого в том же классе или вызвать суперкласс со следующими ограничениями:

  • Это должна быть первая строка кода в вызывающем конструкторе.
  • Он не может иметь явной или неявной ссылки на this. Таким образом, вы не можете передавать внутренний класс (даже анонимный, если он ссылается на какие-либо методы экземпляра) или результат нестатического вызова метода в качестве параметра.

Синтаксис (как упоминалось другими):

MyClass() {
   someInitialization();
}

MyClass(String s) { 
     this();
     doSomethingWithS(s);
}

Ответ 4

FYI, это называется телескопический/телескопический шаблон конструктора.

Обсуждается в JLS 8.8.7.1 Явные вызовы конструктора

  • Альтернативные вызовы конструктора начинаются с ключевого слова this (возможно, предваряемого явными аргументами типа). Они используются для вызова альтернативного конструктора того же класса.
  • Вызовы конструктора суперкласса начинаются либо с ключевого слова super (возможно, предваряемого явным аргументом типа), либо из первичного выражения. Они используются для вызова конструктора прямого суперкласса.

Ответ 5

this(other, args);

Ответ 6

пример:

public class FileDb {

  /**
   * 
   */
  public FileDb() {
    this(null);
  }

  public FileDb(String filename) {
    // ...
  }

}