2013-08-30 79 views
0

感到困惑与输出(即后在MnoshowValue法)方法调用输出混乱

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 
+0

Java通过副本传递,而不是通过引用 – nachokk

回答

2

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

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

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

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 
+0

感谢你GV,实际上我没有正确理解代码,“shovalue after”语句在showvalue()方法里面 – Robo

0

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

所有的ab in showvalue before输出都是在您自己调用函数时产生的,每次都会传递ab的副本。看到ab的值从未真正改变过,一旦所有的showValue调用都被评估过,循环会以相反的顺序解开并打印旧的副本。

0

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

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

明白了吗?