这是面试中提出的问题。 如果一个类在java中有多个构造函数,我们可以从另一个构造函数调用吗?何时?我怎么称为语法?
答案 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)
没有一个答案是完整的,所以我正在添加这个答案以填补空白。
您可以在同一个类中调用另一个构造函数,或者调用超类,具有以下限制:
this
有任何明确或隐含的引用。所以你不能传递一个内部类(如果它引用任何实例方法,甚至是一个匿名的类),或者作为参数传递非静态方法调用的结果。语法(如其他人所述)是:
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) {
// ...
}
}