在C语言中函数的参数有值传递方式以及地址传递方式两种,但是在Java中只有值传递这一种方式。
案例一:
在下面的例子中执行将a乘以3
int a = 10;
three_a(a);
方法three_a()的部分如下:
public static void three_a(int x)
{
x = x*3;
}
将a传入方法中,经过调用three_a()方法之后,首先x=10,x*3之后x变为30,最后离开方法体,a的值仍然是10,没有发生改变,整个过程只是将a的值进行了拷贝。
案例二:
假设构建了一个职工的类:
class Staff
{
private String name; //职工姓名
private double salary; //薪水
publie Staff(String name, double salary)
{
this.name = name;
this.salary = salary;
}
public String getName()
{
return name;
}
public String getSalary()
{
return salary;
}
public void raiseSalary(double p)
{
salary += (salary*p);
}
}
现在需要将一个员工的薪水提高20%,如下:
public class Test
{
public static void main(String[] args)
{
Staff puff = new Staff("puff",5000);
raiseSa(puff);
}
public static void raiseSa(Staff s)
{
s.raiseSalary(0.2);
}
}
开始构建一个新的员工puff,其工资为5000,将对象puff传入方法raiseSa()之后,调用类Staff的raiseSalary()方法使得该员工薪水增加20%,但是这里改变的是一个Staff对象puff,在raiseSa()方法中首先将s指向puff所对应的一个对象,这里的s是对象的引用,调用raiseSalary()方法之后改变的是s指向的对象,同时该对象也是puff指向的对象,最后退出raiseSa()方法后,参数变量s不再使用,而main函数中的puff的salary已经提升了20%。
这是否表明Java也是有按照地址传递呢?
其实并不是,该案例中只是两个对象的引用始终指向同一对象,在下面的一个案例中将展示传入的参数为对象引用时,仍然会出问题。
案例三:
这里编写交换两个职员对象的方法:
public static void swap(Staff x,Staff y)
{
Staff temp = x;
x = y;
y = temp;
}
接下来,构建两个Staff对象,并进行调换:
Staff a = new Staff("puff",5000);
Staff b = new Staff("clearlove",5000);
swap(a,b);
按说上面传入的是引用,应该经过swap()方法之后,a和b两个职员应该发生了互换,但结果仍然a是puff,b是clearlove;解释如下:
首先构建了两个实例对象的引用a和b,分别指向puff和clearlove;
将a和b传入swap()方法之后,方法的参数x和y分别指向puff和clearlove;
在swap()方法内部进行了交换操作之后,x和y分别指向clearlove和puff,可见确实发生了交换;
但是在该方法结束之后,参数变量x和y被丢弃,原来的变量a和b仍然这个swap()方法调用之前所引用的对象,即puff和clearlove,因此虽然传入的是对象的引用,但是调用交换方法之后并没有实现对象的交换。
2万+

被折叠的 条评论
为什么被折叠?



