结论:方法调用的时候涉及到参数传递的问题,实际上传递的是变量中具体的值;
首先看两个例子:
1.传递参数中保存的是一个字面值
代码如下:
class Test01
{
public static void main(String[] args)
{
int i = 10;
add(i);
System.out.println("main方法中i的值是:"+i);//10
}
public void static add(int i){
i++;
System.out.println("add方法中i的值是:"+i);//11
}
}
上面代码的输出值是多少:
main方法中i的值是:10
add方法中i的值是:11
为什么上面的输出会不一样呢?
原因是当程序执行到add方法时,将u的字面值10传递进add方法,在add方法中对u++,所以add方法中的输出是11。因为而当程序回到main方法中,u的值还是10。
上面这个例子的内存图如下:

2.传递参数中保存的是一个地址
代码如下:
public class Test02
{
public static void main(String[] args)
{
User u = new User(20);
add(u);//这里调用add方法传递的值u里面保存的java对象的地址
System.out.println("main中u.age的值是:"+u.age);//21
}
public static void add(User u){
u.age++;
System.out.println("add中u.age的值是:"+u.age);//21
}
}
class User
{
int age;
public User(int age){
this.age = age;
}
}
例2代码的输出值是多少?
main方法中i的值是:21
add方法中i的值是:21
为什么会是这样的输出呢?
因为这个例子中u是一个引用变量,其传递给add方法的是它保存的java对象在堆内存的地址,说白了就是一个地址。因此当代码执行到add方法中的时候,u.age++给age这个实例变量加1,所以add方法中的输出是21。那为什么main方法中的变量也是21呢?这是因为add方法的参数传递了u其中保存的地址,所以当执行完add方法后,程序回到main方法中,u的还是指向同样的User对象,所以u.age的值是21。
例2的内存图如下:
3.总结:
上面例子的唯一的区别是,一般变量其中保存的是字面值,而引用类型的变量其中保存的是它指向对象在堆内存的地址。进行参数传递的时候,都传的是变量中保存的值,只不过上面例子传递值中保存的内容不一样。例子1变量传递都在栈区进行,而例2变量传递值涉及堆区和栈区。