为什么我不能从私有类中的参数化构造函数中调用默认构造函数?

Pho*_*nix 1 java

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

        }

    }



}
Run Code Online (Sandbox Code Playgroud)

为什么编译器抱怨我不能调用this.Node()?

dce*_*chi 8

尝试:

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

    }
Run Code Online (Sandbox Code Playgroud)

对"其他"构造函数的调用需要始终是第一位的.从构造函数内部对其他构造函数的调用总是在this(...)没有的情况下完成Node(...).

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

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

where ExplicitConstructorInvocation(opt)是调用的父类中的替代构造函数或构造函数super(...).

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

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

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

  • 如果此构造函数以同一个类中的另一个构造函数的显式构造函数调用(第8.8.7.1节)开头(使用此方法),则使用这五个相同步骤计算参数并以递归方式处理该构造函数调用.

...

这些JLS规则确保首先调用父类构造函数.


SLa*_*aks 6

您只能将另一个构造函数作为当前构造函数中的第一个语句.

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