在java中从另一个调用一个构造函数

时间:2010-03-03 18:41:43

标签: java constructor

这是面试中提出的问题。 如果一个类在java中有多个构造函数,我们可以从另一个构造函数调用吗?何时?我怎么称为语法?

6 个答案:

答案 0 :(得分:38)

你可以,我知道的语法是

this(< argument list >);

你也可以通过

调用超类的构造函数
super(< argument list >);

这两个调用只能作为构造函数中的第一个语句来完成(所以你只能调用另一个构造函数,并且在完成任何其他操作之前)。

答案 1 :(得分:11)

是的,你可以这样做。

查看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为10。

答案 2 :(得分:10)

没有一个答案是完整的,所以我正在添加这个答案以填补空白。

您可以在同一个类中调用另一个构造函数,或者调用超类,具有以下限制:

  1. 它必须是调用构造函数中的第一行代码。
  2. 它不能对this有任何明确或隐含的引用。所以你不能传递一个内部类(如果它引用任何实例方法,甚至是一个匿名的类),或者作为参数传递非静态方法调用的结果。
  3. 语法(如其他人所述)是:

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

答案 3 :(得分:8)

仅供参考,这称为telescoping/telescopic constructor pattern

JLS 8.8.7.1 Explicit Constructor Invokations

中进行了讨论
  
      
  • 备用构造函数调用以关键字this开头(可能以显式类型参数开头)。它们用于调用同一类的备用构造函数。
  •   
  • 超类构造函数调用以关键字super(可能以显式类型参数开头)或主表达式开头。它们用于调用直接超类的构造函数。
  •   

答案 4 :(得分:7)

this(other, args);

答案 5 :(得分:6)

示例:

public class FileDb {

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

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

}