传值调用
传值调用不会改变变量的值,在函数弹栈后,原变量的值不变。
class Demo
{
public static void main(String[] args)
{
int x = 6;
show(x); //在此函数进栈(被调用)时,x值得暂时会变成5,在函数弹栈(调用结束)后,变量的值依旧是6。
System.out.println(x);
}
publicstatic void show(int x) //这里的x仅仅只是一个参数而已,实际上这里把x换成abcd什么都行
{
x= 5;
}
}
Q:为什么传值调用没有改变原变量的值?
A:实际上,在执行show(x)时,传入括号里的x是原变量的一个副本,在show函数内部只是改变了x的副本,在show弹栈后,改变的副本就消失了,原来“真身”x是没有发生任何变化的。
此处贴上相应的C++代码供理解。
上面的代码里,传入show的是x的副本,用a代表。a是5,和原来x是几并没有关系,所以值不变,依旧是5。
传址调用
传址调用会改变变量的值,在函数弹栈后,原变量的值改变。
class Demo
{
int x = 6;
public static void main(String[] args)
{
Demo d = new Demo();
d.x = 8;
show(d); //此函数被传入的参数值为对象d的地址,函数对地址的操作
//是永久性的,在该函数弹栈后,原变量值发生改变。
System.out.println(d.x);
}
public static void show(Demo d) //被传入的参数值为对象d的地址,
{ //该函数操作d的地址,将其成员变
d.x = 5; //量x的值更改为5,改变是永久性的
}
}
Q:为什么传址调用改变了原变量的值?
A:在执行show(Demo d)时,传入括号里的是对象d的地址,对地址的操作就是对内存的操作,它不像操作变量值的副本一样,在函数出栈后副本就消失,对地址的操作会直接永久性的改变内存中的值。
处贴上相应的C++代码供理解。
上面的代码里,传入show的是x的地址,用a代表。对地址a的操作就是对原变量所在内存的操作,改变是永久性的。