Этот вопрос уже имеет ответ здесь:
Это было вопросом, который задают в интервью. Мы можем вызвать одного конструктора от другого, если класс имеет несколько конструкторов в Java и когда? Как я могу звонить, я имею в виду синтаксис?
You может, и я знаю синтаксис
this(< argument list >);
. Вы также можете вызвать конструктор суперкласса через
super(< argument list >);
. Оба таких вызова могут быть выполнены только в качестве первого оператора в конструкторе (так что вы можете вызвать только один другой конструктор, и перед все остальное сделано).
Да, вы можете это сделать.
Посмотрите, например, на реализацию 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);
}
Второй конструктор вызывает первый с емкостью по умолчанию
, равной десяти.
Ни один из ответов не является полным, поэтому я добавляю этот, чтобы заполнить пробелы.
Вы можете вызвать один конструктор из другого в том же классе, или вызвать суперкласс, со следующими ограничениями:
this
. Таким образом, вы не можете передать внутренний класс (даже анонимный, если он ссылается на какие-либо методы экземпляра) или результат вызова нестатического метода в качестве параметра. Синтаксис (как упоминалось другими) таков:
MyClass() {
someInitialization();
}
MyClass(String s) {
this();
doSomethingWithS(s);
}
К вашему сведению, это называется паттерн телескопического / телескопического конструктора .
Это обсуждается в JLS 8.8.7.1 Явные вызовы конструктора
- Вызов альтернативных конструкторов начинается с ключевого слова
this
(возможно, с предисловием явных аргументов типа). Они используются для вызова альтернативного конструктора того же класса.- Вызов конструктора суперкласса начинается либо с ключевого слова
super
(возможно, с предисловием явных аргументов типа), либо с первичного выражения. Они используются для вызова конструктора прямого суперкласса.
пример:
public class FileDb {
/**
*
*/
public FileDb() {
this(null);
}
public FileDb(String filename) {
// ...
}
}