整个程序中if语句 block 执行后,如何出现“System.out.println("after method showValue\t:"+ab);”语句仍然能够获取以前的值吗?我以为这个语句每次都会打印 0 但它没有发生?
public class Me{
public static void main(String[] args) {
int ab=98;
System.out.println(" value of ab in main at start\t:"+ab);
Mno ref=new Mno();
ref.showValue(ab);
System.out.println("value of ab in Main After completion\t:"+ab);
}
}
class Mno{
void showValue(int ab){
System.out.println("Before method showvalue\t:"+ab);
if (ab!=0){
showValue(ab/10);}
System.out.println("after method showValue\t:"+ab);
}
}
最佳答案
Java 是按值传递的,因此在 showValue()
中,您不会处理在 main()
中声明的 ab
code> 而是处理副本。想想看,您甚至没有在任何地方重新分配 ab
,那么它怎么可能改变呢?
无论如何,您都可以看到按值传递概念的工作原理:
public static void main(String[] args) {
int n = 42;
foo(n);
System.out.println(n);
}
public static void foo(int n) {
n = 0;
}
42
在 foo()
中,我们重新分配 n
的副本,而不是更改 main()< 中定义的
.n
/
编辑我现在明白你在问为什么showValue()
中的第二个打印语句每次都不打印0
到达了。要了解原因,让我们手动单步执行函数调用。这就是当您在 main()
中调用 showValue(ab)
时发生的情况:
- 使用参数
ab = 98
调用函数。 - 打印
98
(第一个打印语句) 98 != 0
,所以:(if
-语句)- 使用参数
ab = ab/10 == 9
再次调用函数。 - 打印
9
(第一个打印语句) 9 != 0
,所以:(if
-语句)- 使用参数
ab = ab/10 == 0
再次调用函数。 - 打印
0
(第一个打印语句) 0 == 0
,因此不要输入if
语句。- 打印
0
(第二个打印语句)
- 使用参数
- 打印
ab
,这里是9
。(第二条打印语句)
- 使用参数
- 打印
ab
,此处为98
。(第二条打印语句)
关于java - 方法内语句的执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18802841/