0

プログラム全体でifブロックを実行した後に、「System.out.println("after method showValue\t:"+ab);」という文を 以前の値を取得できますか? このステートメントは毎回 0 を出力すると思っていましたが、そうではありませんか?

public class Me{

public static void main(String[] args) {
    int ab=98;
    System.out.println(" value of ab in main at start\t:"+ab);
    Mno ref=new Mno();
    ref.showValue(ab);
    System.out.println("value of ab in Main After completion\t:"+ab);
}
}

class Mno{
    void showValue(int ab){
    System.out.println("Before method showvalue\t:"+ab);
    if (ab!=0){
        showValue(ab/10);}
    System.out.println("after method showValue\t:"+ab);

}

}

4

1 に答える 1

3

Java は値渡しであるため、宣言した をshowValue()処理するのではなく、コピーを処理します。考えてみれば、あなたはどこにも再割り当てさえしていないのに、どうしてそれが変わる可能性があるのでしょうか?abmain()ab

いずれにせよ、値渡しの概念が次のように機能していることがわかります。

public static void main(String[] args) {
    int n = 42;
    foo(n);
    System.out.println(n);
}

public static void foo(int n) {
    n = 0;
}
42

では、 で定義された を変更するのではなくfoo()、 のコピーを再割り当てしています。nnmain()


編集2番目のprintステートメントが到達するたびにshowValue()印刷されない理由を尋ねていることがわかりました。0その理由を確認するために、関数呼び出しを手で実行してみましょう。これを で呼び出すとshowValue(ab)、次のようになりますmain()

  • の引数で関数を呼び出しますab = 98
  • 印刷98(最初の印刷ステートメント)
  • 98 != 0、そう: ( if-ステートメント)
    • の引数で関数を再度呼び出しますab = ab/10 == 9
    • 印刷9(最初の印刷ステートメント)
    • 9 != 0、そう: ( if-ステートメント)
      • の引数で関数を再度呼び出しますab = ab/10 == 0
      • 印刷0(最初の印刷ステートメント)
      • 0 == 0ifので、 -statementは入力しないでください。
      • 印刷0(2 番目の印刷ステートメント)
    • abここにある を印刷し9ます。(2 回目の印刷ステートメント)
  • abここにある を印刷し98ます。(2 回目の印刷ステートメント)
于 2013-09-14T14:41:42.937 に答える