方法调用输出混乱

时间:2013-08-30 02:11:39

标签: java

我对输出感到困惑(即在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 个答案:

答案 0 :(得分:2)

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

在基元的情况下,它是值的副本,在Object的情况下,它是对象的引用的副本。

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

答案 1 :(得分: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

答案 2 :(得分:0)

每次showValue递归调用函数ab!=0,再加上Java传递ab的副本,导致输出以金字塔形式出现

当您从内部调用函数时,会导致所有ab in showvalue before输出,每次都会传递ab的副本。看到ab的值从未实际更改过,一旦评估了所有showValue个调用,循环就会以相反的顺序解开并打印旧副本。

答案 3 :(得分:0)

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

ShowValue(98) - > ShowValue(9) - > ShowValue(0)

知道了吗?