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

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

你可以,我知道的语法是

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); } 

第二个构造函数调用第一个default capacity为10的构造函数。

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

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

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

语法(如其他人所提到的)是:

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

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

它在JLS 8.8.7.1显式构造函数调用中讨论过

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

例:

 public class FileDb { /** * */ public FileDb() { this(null); } public FileDb(String filename) { // ... } }