2017-01-03 15 views
-3

myMethod内部で変更する変数がその範囲外で変更されないのはなぜですか?Javaは値渡しか参照渡しですか?

public class TestLoop { 

    public static void main(String[] args) { 
     myMethod(0, 3); 

    } 

    static void myMethod(int i, int j) { 
     System.out.println("i for:" + i + " j:" + j); 
     if (i == j) 
      return; 
     else { 

      myMethod(i + 1, j); 
      System.out.println("after myMethod Call for: i:" + i + " j: " + j); 
     } 
     System.out.println("outside i for: " + i); 
    } 
} 
+3

「ロールバック」とはどういう意味ですか?変数はメソッド以外の場所には存在しません。戻り値の後にどのようにすることができますか?メソッドの呼び出しがメソッドの外の変数を変更しないことを意味するならば、それはそのままです。 'return'とは何の関係もなく、変数は外で変化しません。 '0'や' 3'はどうやって変わるでしょうか? –

+0

ローカル変数が条件 'i == j'を満たすときに終了し、ローカル変数について読み込み、 –

+0

を返すことができます。void関数内で 'return 'を実行できます。ループ – SomeJavaGuy

答えて

1

あなたがmyMethod(i + 1, j)を呼び出すたびに、新しいローカル変数ijはスタック上に作成され、呼び出し側によって渡された値に初期化されています。 が実行されるたびに、ローカル変数ijが範囲外になります。直前のmyMethod()の実行に戻ります。実行には独自のローカル変数ijがあります。

最後に、元myMethod(0,3)コールにコールスタックが戻ると、その実行は、ローカル変数iと値03jを持っている場合。

ijの値は決して変更されません。 ijという名前の複数のローカル変数があり、それぞれが限定された範囲を持っています。

+0

あなたが言及したようにまったく同じことが起こっていますが、決してそのようなことにつまずくことはありませんもの。より深刻な例を参照すると素晴らしいでしょう。私はこのコードをマージソートの実装で見ました。 –

+0

@RoseK、あなたはその用語を知らなかったので、簡単に検索する方法はありませんでした。これはStack Overflowやインターネット上で議論されていますので、今度はこの質問から始めて、より多くの情報を得る方法があります:http://stackoverflow.com/questions/40480/is-java-pass-by-reference - または - 値渡し/ 40523#40523 – clearlight

0

JLS - Chapter 14. Blocks and Statementsは、あなたの質問に対する答えが含まれています

break(14.15)、continue(14.16)、およびreturn(14.17)文があること制御の移行を引き起こしますそれらを含むステートメントの正常な完了を妨げる可能性があります。

コントロールは、メソッドが呼び出されたステートメントに戻されます。

関連する問題