初学Java遇到一个诧异的问题,Java函数的对象参数到底是拷贝传递还是引用传递,为了验证这个问题,写了以下的一个测试类:
class Employee
{
private String name;
public Employee(String s)
{
name = s;
}
public void setName(String s)
{
name = s;
}
public String getName()
{
return name;
}
}
然后编写调用的主函数:
class testValue
{
public static void main(String[] args)
{
Employee a = new Employee("Alice");
Employee b = new Employee("Sam");
Employee c = new Employee("Coca");
swap(a, b);
System.out.println(a.getName());
System.out.println(b.getName());
c = a;
a = b;
b = c;
System.out.println(a.getName());
System.out.println(b.getName());
changeValue(a);
System.out.println(a.getName());
}
public static void swap(Employee x, Employee y)
{
Employee temp = x;
x = y;
y = temp;
}
public static void changeValue(Employee x)
{
x.setName("HH");
}
}
于是,神奇的事情发生了,以下是打印结果:
vilarsail@OptiPlex-9020:~/test$ java testValue
Alice
Sam
Sam
Alice
HH
由于以前C++思想比较重,所以想到:如果是引用传递的方式,那swap()以后应该是交换了的,但是打印的结果却没有交换,如果是拷贝的方式新生成一个对象,那么在调用changeValue()的时候就当然不会影响原先变量的值,但是事实却是改变了。。。偶槽。。。
查了许多资料以后得出结论,Java的确是拷贝方式传递参数的,然而,此拷贝却跟C++有本质的不同,C++拷贝时候会新建一个对象,成立新的数据块,但是Java却是更类似于C++的指针传递,在传递参数时候相当于拷贝了一个地址指针,因此,在swap()函数里面更改x变量指针指向的对象不会影响到原先的a变量,在changeValue()中由于a和x指向的是同一个对象因此a指向的私有数据的变化当然会影响到x。
哈哈哈,苦逼的C++转Java程序猿~~~
网友评论