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(...)なくで行われNode(...)ます。

JLSセクション8.8.7は、コンストラクター本体がどのように見えるかを指定します。

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

ここExplicitConstructorInvocation(opt)で、は代替コンストラクターか、。で呼び出された親クラスのコンストラクターsuper(...)です。

JLSセクション12.5は、コンストラクターが呼び出されたときのオブジェクトの初期化ステップを指定します。

結果として新しく作成されたオブジェクトへの参照が返される直前に、指定されたコンストラクターが処理され、次の手順を使用して新しいオブジェクトが初期化されます。

  • コンストラクターの引数を、このコンストラクター呼び出し用に新しく作成されたパラメーター変数に割り当てます。

  • このコンストラクターが(これを使用して)同じクラス内の別のコンストラクターの明示的なコンストラクター呼び出し(§8.8.7.1)で始まる場合は、引数を評価し、これらの同じ5つのステップを使用してそのコンストラクター呼び出しを再帰的に処理します。

..。

これらの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 に答える