首先介绍一下值传递与引用传递分别是什么?
在程序设计语言中将参数传给方法或函数的方式目前有两种(以前还有一种是名称传递,比如古老的Algol语言,这种方式已成为历史),一种是值传递,一种是引用传递。值传递表示将实参的值传递给方法;引用传递表示将实参的地址引用传递给方法。Java总是采用值传递的,Java程序中的方法得到的总是实参值的拷贝,下面用代码验证一下:
将基本数据类型Double传入方法:
public class ValueOrReference {
public static void main(String[] args){
double x = 10.0;
System.out.println("执行方法前:"+ x);
BasicDataType(x);
System.out.println("执行方法后:"+ x);
}
public static void BasicDataType(Double x){
x += 10;
}
}
结果:
如果Java采用的是引用传递,执行方法后x的值就应该是20.0,而不是10.0,结果说明传入方法的是x的值。
将对象引用传入方法:
//首先定义一个Cat类
public class Cat {
String name;
public Cat(String name){
this.name = name;
}
public String getName() {
return name;
}
}
//下面是主函数:
public class ValueOrReference {
public static void main(String[] args){
Cat cat01 = new Cat("球球");
Cat cat02 = new Cat("嘟嘟");
System.out.println("执行方法前:\n"+"cat01:"+cat01+" name:"+cat01.getName()+"\ncat02:"+cat02+" name:"+cat02.getName());
SwapCat(cat01,cat02);
System.out.println("执行方法后:\n"+"cat01:"+cat01+" name:"+cat01.getName()+"\ncat02:"+cat02+" name:"+cat02.getName());
}
public static void SwapCat(Cat cat01,Cat cat02){
Cat temp = cat01;
cat01 = cat02;
cat02 = temp;
System.out.println("执行方法中:\n"+"cat01:"+cat01+" name:"+cat01.getName()+"\ncat02:"+cat02+" name:"+cat02.getName());
}
}
结果:
执行完SwapCat方法前后,cat01和cat02的地址并没有发生交换,说明方法并没有改变对象的引用,由此可见Java不是引用传递;但为什么方法中的数据发生改变了呢?是因为Java是值传递,当参数为对象引用类型时,传入方法的是对象地址的拷贝值。
如有错误,敬请指正