友情提示,参考这篇文章Java参数传递原理和JVM详解一起看会更加容易理解。
要了解Java中参数传递的原理,首先你要先知道按值传递和按引用传递的区别。
按值传递表示方法接受的是调用者提供的值,按引用传递表示方法接受的是调用者提供的变量地址。一个方法可以修改传递引用所对应的变量值,而不能修改传递值调用所对应的变量值。而Java程序设计语言总是采用按值调用,也就是说,方法得到的是所有参数值的一个拷贝。下面我将举一些实例来具体说明:
#基本数据类型
public static void main(String[] args) {
// TODO Auto-generated method stub
int a=10,b=20;
swap(a,b);
System.out.println(a+"-------"+b);
}
public static void swap(int a,int b) {
int temp=a;
a=b;
b=temp;
}
其结果为
原理相当于:
执行swap之前:
执行swap之后:
从图中可以看出:执行swap前后,实参ab并没有改变。改变的只是形参ab,而形参ab在执行完swap之后就被撤销了(局部变量在方法执行结束后被撤销)。所以最后a=10,b=20;
#类类型
类类型直接传递
public class scdn {
public static void main(String[] args) {
// TODO Auto-generated method stub
employee tom=new employee();
tom.setId(10);
employee jarry=new employee();
jarry.setId(20);
System.out.println(tom.getId()+"-------"+jarry.getId());
}
public static void swap(employee a,employee b) {
employee temp=a;
a=b;
b=temp;
}
}
class employee{
private int id;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
}
结果为
其原理和上面差不多。
类类型通过方法传递
public class scdn {
public static void main(String[] args) {
// TODO Auto-generated method stub
employee tom=new employee();
tom.setId(10);
employee jarry=new employee();
jarry.setId(20);
swap(tom, jarry);
System.out.println(tom.getId()+"-------"+jarry.getId());
}
public static void swap(employee a,employee b) {
int temp;
temp=a.getId();
a.setId(b.getId());
b.setId(temp);
}
}
class employee{
private int id;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
}
结果为:
执行swap之前:
执行swap之后:
为什么类类型通过这两个不同swap方法之后结果会不同呢?这是因为第二个swap中实参tom和形参a一直指向的是同一个地址(x),jarry和b一直指向(y),所以最后修改形参可以改变实参的值。