2010-03-03 9 views
23

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

+0

Можете ли вы прояснить этот вопрос? Несколько конструкторов существуют для создания объектов по-разному и могут быть вызваны из других классов.Они сделаны именно для этой цели. –

+4

он имеет в виду вызов конструктора из другого. – Woot4Moo

+0

он спрашивает, разрешено ли ему вызывать конструктор из другого конструктора или нет, когда класс имеет более одного конструктора. – Francis

ответ

36

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

this(< argument list >); 

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

super(< argument list >); 

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

+6

И вы не можете делать ничего, что требует ссылки на это. –

+0

он также должен быть в первой строке конструктора – sixtyfootersdude

+0

да, первая строка, поэтому он будет первым, который будет реализован – Francis

6
this(other, args); 
+3

Это либо вводит в заблуждение, либо просто неправильно! Что еще? Вы просто вызываете другой конструктор, используя 'this (args-required-by-constructor)' или 'super (args-required-by-constructor);' –

5

пример:

public class FileDb { 

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

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

} 
9

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

Посмотрите на 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 десять.

7

FYI, это называется telescoping/telescopic constructor pattern.

Это обсуждается в JLS 8.8.7.1 Explicit Constructor Invokations

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

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

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

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

Синтаксис (как уже отмечалось другими) является:

MyClass() { 
    someInitialization(); 
} 

MyClass(String s) { 
    this(); 
    doSomethingWithS(s); 
} 
Смежные вопросы