众所周知,将参数传递给方法的方式分为两种,值传递和引用传递,前者表示方法接受的是调用者提供的值,后者表示方法接受的是调用者提供的变量地址,方法可以修改按引用传递变量的值,而不能修改按值传递的变量的值
我们知道,在C语言中,采用的是值传递的方式,所以我们无法使用通过向某一个函数传递x,y来改变x,y的值,而如果我们想在C语言的一个方法中修改x,y的值,采用的方法是向函数传递x,y变量的指针
double percent=10;
public static void tripleValue(double x)
{
x=3*x;
}
tripleValue(percent)
在以上语句执行后,无论执行即便,percent的值始终为10
也就是说
同样的,在Java语言中采用的同样是按值传递的方式,也就是说,方法得到的是所有参数值的一个副本,但是,令人头痛的是,Java不具有像C语言那样的指针类型,所以,如果想要在函数中修改某一全局变量的值就得重新想一个解决办法
我们考虑,在Java中,虽然没有指针类型,但是有与指针类型作用相似的类型,就是对象,一个方法不能修改基本数据类型的参数,但是对象引用作为参数就不同了,可以很容易的利用下面这个方法将一个员工的工资增加三倍
public static void tripleSalary(Employee x)
{
x.raiseSalary(200);
}
可以这么理解,x与传入的实参对象同时引用于一个对象,这就类似于C语言中传入一个指针,然后修改指针指向的变量或者结构中的变量的值
考虑以下代码
public static void swap(Employee x,Employee y)
{
Employee temp=x;
x=y;
y=temp;
}
是否可以交换x与y引用的对象?
答案是否定的,虽然该方法传入了两个对象,根据我们之前所说的,该方法传入了两个对象的引用,如果将x与y的引用交换,x与y在方法结束后变进行了销毁,此时,如果还有两个变量分别只想了x与y引用的对象,他俩所引用的对象不会发生交换
那么,现在就又有一个问题,如果我想要改变某个全局变量的值,但是这个变量不在对象内部怎么办,除了创建一个对象以外,我们还可以将这个变量放在一个数组中,其实原理还是一样的,因为我们知道,数组本身其实就是Java自带的一个类,其原理也相当于是将变量放到了一个数组中