1
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() ?

4

4 回答 4

8

尝试:

 Node(K data)
    {
        this();
        this.data = data;

    }

对“其他”构造函数的调用必须始终是第一个。从构造函数内部调用其他构造函数总是使用this(...)not with完成Node(...)

JLS 第 8.8.7 节指定构造函数主体的外观:

ConstructorBody: { ExplicitConstructorInvocation(opt) BlockStatements(opt) }

whereExplicitConstructorInvocation(opt)是备用构造函数或来自用 调用的父类的构造函数super(...)

JLS 第 12.5 节指定调用构造函数时的对象初始化步骤:

就在对新创建对象的引用作为结果返回之前,使用以下过程处理指示的构造函数以初始化新对象:

  • 将构造函数的参数分配给此构造函数调用的新创建的参数变量。

  • 如果此构造函数以同一类中另一个构造函数的显式构造函数调用(第 8.8.7.1 节)开始(使用 this),则评估参数并使用这五个相同的步骤递归地处理该构造函数调用。

...

这些 JLS 规则确保父类构造函数首先被调用一次。

于 2012-09-09T22:22:34.990 回答
6

您只能调用另一个构造函数作为当前构造函数中的第一条语句。

this.data = data;下面移动this()

于 2012-09-09T22:22:09.950 回答
2

为了在另一个中调用构造函数:

  1. 您必须使用 调用它this(args)
  2. 您必须将其作为构造函数中的第一条语句调用。

    Node(K data) {
        this();
        this.data = data;
    }
    
于 2012-09-09T22:25:27.043 回答
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);
    }  
}
于 2012-09-09T22:31:45.117 回答