0

我对输出感到困惑(即showValue在类中的方法之后Mno

class Lab2 {
    public static void main(String[] aa) {
        int ab=98;
        System.out.println("ab in main before\t:"+ab);
        Mno ref = new Mno();
        ref.showValue(ab);

        System.out.println("ab in Main After\t:"+ab);
    }
}

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

我得到以下输出......它如何在 0,9,98 之后打印显示值......?

F:\Train\oops>java Lab2
ab in main before       :98
ab in showvalue before  :98
ab in showvalue before  :9
ab in showvalue before  :0
ab in showvalue After   :0
ab in showvalue After   :9
ab in showvalue After   :98
ab in Main After        :98
4

4 回答 4

2

在 Java 中,仅在方法调用期间传递变量的副本。

在原语的情况下,它是值的副本,在 Object 的情况下,它是对 Object 的引用的副本。

因此,当您将副本传递给 showValue 方法时,main 方法中的 int ab 的值不会改变。

于 2013-08-30T02:17:12.383 回答
0

它是一个递归调用。程序的控制返回到它以不同的值调用自身的那个点。看你的电话->

显示值(98)->显示值(9)->显示值(0)

知道了?

于 2013-08-30T07:50:25.697 回答
0

您在这里进行递归调用:

ab in showvalue before :98
showValue(98);
ab in showvalue before :9
 -> showValue(9);
  ab in showvalue before :0
  -> showValue(0); //if returns true here, so no more recursive call
  ab in showvalue after :0
 ab in showvalue after :9
ab in showvalue before :98
于 2013-08-30T02:22:08.503 回答
0

showValue每次,您都在递归调用该函数ab!=0,再加上 Java 正在传递 的副本这一事实ab,导致您的输出以金字塔形式出现。

所有ab in showvalue before输出都是在您从自身内部调用函数时引起的,ab每次都传递一个副本。ab由于从未实际更改过的值,一旦所有showValue调用都被评估,循环就会解开并以相反的顺序打印旧副本。

于 2013-08-30T02:40:30.427 回答