方法调用输出混乱



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

class Lab2 {
    public static void main(String[] aa) {
        int ab=98;
        System.out.println("ab in main beforet:"+ab);
        Mno ref = new Mno();
        ref.showValue(ab);
        System.out.println("ab in Main Aftert:"+ab);
    }
}
class Mno {
    void showValue(int ab) {
        System.out.println("ab in showvalue beforet:"+ab);
        if (ab!=0)
            showValue(ab/10);
        System.out.println("ab in showvalue Aftert:"+ab);
    }
}

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

F:Trainoops>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

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

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

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

您在这里进行递归调用:

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

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

所有ab in showvalue before输出都是在从函数内部调用函数时产生的,每次都传递一个ab的副本。由于ab的值从未实际更改,一旦所有showValue调用都已求值,循环就会分解并按相反顺序打印旧副本。

这是一个递归调用。程序的控制返回到它用不同值调用自己的点。查看您的呼叫->

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

明白了吗?

相关内容

  • 没有找到相关文章