0

私は現在、ダイクストラ アルゴリズムを実装する Java プロジェクトに取り組んでいます。これに似たコードがあります

    public static void main(String[] args){
      Graph myGraph = null;
      execute(myGraph);
    }

    private static void execute(Graph graph){
      while(!quit){
      doCommand(graph);
    }}


    doCommand(Graph graph){
      if(command == n){
        graph = new Graph(size); }}

私のプログラムでは、いくつかのコマンドを入力できます。たとえば、n 5 は、プログラムが 5 つのノードを持つ新しいグラフを作成する必要があることを意味します。今私の問題は、例えば n 5 を入力した後、それがまだnullであることです。私の意見では、myGraph は n コマンドの後に新しい参照を受け取る必要がありますが、明らかにそうではなく、理由もわかりません。ところで、行 graoh = new Graph(size); 確実に実行されます。それは間違いではありません。

4

5 に答える 5

0

このコードを試してください!

public static void main(String[] args){
    Graph myGraph = new Graph();
    doCommand(myGraph);
    System.out.println(myGraph);
}
private static void doCommand(Graph myGraph){
    myGraph = new Graph();
    System.out.println(myGraph);
}

両方の System.out.println ステートメントが異なるオブジェクト参照を出力することに気付くでしょう。

これは、doCommand メソッドを呼び出して myGraph の参照の値を渡し、doCommand メソッドで新しいオブジェクト Graph() を作成すると、ローカル変数 myGraph (doCommand 内) が新しいオブジェクトを指すようになるためですが、 main() の myGraph の値は変更されません。

ただし、次のようなことをすると:

public static void main(String[] args){
    Graph myGraph = new Graph();
    myGraph = doCommand(myGraph);
    System.out.println(myGraph);
}
private static Graph doCommand(Graph myGraph){
    myGraph = new Graph();
    System.out.println(myGraph);
    return myGraph;
}

どちらの println ステートメントも同じオブジェクト参照を出力します。これは、doCommand 内の myGraph の参照の値を main 内の myGraph に返しているためです。

于 2013-10-29T21:16:04.463 に答える