我对输出感到困惑(即在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)
明白了吗?