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

gir*_*iri 31 java constructor

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

Sea*_*ean 40

你可以,我知道的语法是

this(< argument list >);
Run Code Online (Sandbox Code Playgroud)

你也可以通过调用超类的构造函数

super(< argument list >);
Run Code Online (Sandbox Code Playgroud)

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

  • 你不能做任何需要参考的事情. (6认同)

Pet*_*ang 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);
}
Run Code Online (Sandbox Code Playgroud)

第二个构造函数使用default capacity十个调用第一个构造函数.


Yis*_*hai 10

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

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

  1. 它必须是调用构造函数中的第一行代码.
  2. 它不能有任何明确或隐含的引用this.因此,如果它引用任何实例方法,或者非静态方法调用的结果作为参数,则无法传递内部类(甚至是匿名的类).

语法(如其他人所述)是:

MyClass() {
   someInitialization();
}

MyClass(String s) { 
     this();
     doSomethingWithS(s);
}
Run Code Online (Sandbox Code Playgroud)


pol*_*nts 8

仅供参考,这被称为伸缩/伸缩构造模式.

它在JLS 8.8.7.1 Explicit Constructor Invokations中讨论过

  • 替代构造函数调用以关键字this开头(可能以显式类型参数开头).它们用于调用同一类的备用构造函数.
  • 超类构造函数调用以关键字super(可能以显式类型参数开头)或主表达式开头.它们用于调用直接超类的构造函数.


Oli*_*Oli 7

this(other, args);
Run Code Online (Sandbox Code Playgroud)

  • 这要么是误导性的,要么是完全错误的!还有什么?你只需使用`this(args-required-by-constructor)`或`super(args-required-by-constructor)调用另一个构造函数;` (3认同)

Syn*_*nox 6

例:

public class FileDb {

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

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

}
Run Code Online (Sandbox Code Playgroud)