public class Graph {
private Node node;
public void createGraph()
{
}
private class Node<K>{
K data;
List<Node> adjacent;
boolean visited;
Node()
{
adjacent = new ArrayList<Node>();
visited = false;
}
Node(K data)
{
this.data = data;
this.Node();
}
}
}
为什么编译器抱怨我不能调用this.Node()?
答案 0 :(得分:8)
尝试:
Node(K data)
{
this();
this.data = data;
}
对“其他”构造函数的调用需要始终是第一位的。从构造函数内部对其他构造函数的调用始终使用this(...)
,而不是Node(...)
。
JLS section 8.8.7指定构造函数体的外观:
ConstructorBody:{ExplicitConstructorInvocation(opt) BlockStatements(OPT) }
其中ExplicitConstructorInvocation(opt)
是替代构造函数或来自使用super(...)
调用的父类的构造函数。
和JLS section 12.5指定调用构造函数时的对象初始化步骤:
在作为结果返回对新创建的对象的引用之前,处理指示的构造函数以使用以下过程初始化新对象:
将构造函数的参数分配给此构造函数调用的新创建的参数变量。
如果此构造函数以同一个类中的另一个构造函数的显式构造函数调用(第8.8.7.1节)开头(使用此方法),则使用这五个相同步骤计算参数并以递归方式处理该构造函数调用。
...
这些JLS规则确保首先调用父类构造函数。
答案 1 :(得分:6)
您只能将另一个构造函数作为当前构造函数中的第一个语句。
将this.data = data;
移到this()
下方。
答案 2 :(得分:2)
为了在另一个内部调用构造函数:
this(args)
。您必须将其作为构造函数中的第一个语句调用。
Node(K data) {
this();
this.data = data;
}
答案 3 :(得分:0)
当我需要创建更多构造函数时,我这样做(假设,参数集只会扩展,而不是完全改变):
public class Foo
{
private static final int DEFAULT_SECOND = ...;
private static final int DEFAULT_FIRST = ...;
//Constructor with the biggest attribute set
public Foo(int first, int second)
{
//do the actual initialization
}
public Foo(int first)
{
this(first, DEFAULT_SECOND);
}
public Foo()
{
this(DEFAULT_FIRST, DEFAULT_SECOND);
}
}