вызовите одного конструктора от другого в Java [дубликат]

Этот вопрос уже имеет ответ здесь:

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

31
задан sixtyfootersdude 11 July 2010 в 00:46
поделиться

6 ответов

You может, и я знаю синтаксис

this(< argument list >);

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

super(< argument list >);

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

40
ответ дан 27 November 2019 в 21:44
поделиться

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

Посмотрите, например, на реализацию 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);
}

Второй конструктор вызывает первый с емкостью по умолчанию , равной десяти.

11
ответ дан 27 November 2019 в 21:44
поделиться

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

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

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

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

MyClass() {
   someInitialization();
}

MyClass(String s) { 
     this();
     doSomethingWithS(s);
}
10
ответ дан 27 November 2019 в 21:44
поделиться

К вашему сведению, это называется паттерн телескопического / телескопического конструктора .

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

  • Вызов альтернативных конструкторов начинается с ключевого слова this (возможно, с предисловием явных аргументов типа). Они используются для вызова альтернативного конструктора того же класса.
  • Вызов конструктора суперкласса начинается либо с ключевого слова super (возможно, с предисловием явных аргументов типа), либо с первичного выражения. Они используются для вызова конструктора прямого суперкласса.
8
ответ дан 27 November 2019 в 21:44
поделиться
this(other, args);
7
ответ дан 27 November 2019 в 21:44
поделиться

пример:

public class FileDb {

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

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

}
6
ответ дан 27 November 2019 в 21:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: