博主是大三的在校大学生,学习计算机的路上,有些自己的感悟,写下来互相讨论下,欢迎吐槽。
我们都知道将参数传递给方法时有两种,第一种是按值调用(called by value)表示方法接收的是调用者提供的值,第二种是按引用传递(called by reference)表示方法接收的是调用者提供的变量的地址。方法可以修改传递引用所对应的变量值,而不能修改传递值调用的所对应的变量值。比如:
public void swap(int x,int y){
int m=y;
y=x;
x=m;
}
这样很明显是不可以交换的,如果用c++引用可以做到,或者指针也可以做到。
java方法参数类型共有两种类型,一是基本数据类型,二是对象引用,当对象的引用作为参数时,对象引用来修改对象里面的值。但是很多人存在一个误区,认为java可以像c++那样有对象引用的交换的功能,但是实际上是不对的,java总是采用的是按值调用,方法得到的是所有参数值的一个拷贝,方法不能修改传递给它的任何参数变量的内容。例如:
class test{
test a;
test b;
swap(a,b);
public void swap(test x,test y){
test te;
te=x;
x=y;
y=te;
}
}
如果java是对对象的采用是引用调用,那么这个方法是可以进行对象的交换的,但是方法并没有改变存储在变量a和b中的引用,也就是说swap方法的参数x和y被初始化两个对象的引用的拷贝,只是引用计数加1,方法结束时参数x和y的被丢弃,a,b还是仍然引用这个方法调用之前的所引用的对象。
因此实际上java对对象引用进行的是值传递。
总结下:
一个方法不能修改一个基本数据类型的参数。
一个方法可以改变一个对象参数的状态。
一个方法不能让对象参数引用一个新的对象。