初學(xué)Java遇到一個(gè)詫異的問(wèn)題凭需,Java函數(shù)的對(duì)象參數(shù)到底是拷貝傳遞還是引用傳遞税稼,為了驗(yàn)證這個(gè)問(wèn)題赞枕,寫(xiě)了以下的一個(gè)測(cè)試類(lèi):
class Employee
{
private String name;
public Employee(String s)
{
name = s;
}
public void setName(String s)
{
name = s;
}
public String getName()
{
return name;
}
}
然后編寫(xiě)調(diào)用的主函數(shù):
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");
}
}
于是,神奇的事情發(fā)生了草戈,以下是打印結(jié)果:
vilarsail@OptiPlex-9020:~/test$ java testValue
Alice
Sam
Sam
Alice
HH
由于以前C++思想比較重题造,所以想到:如果是引用傳遞的方式,那swap()以后應(yīng)該是交換了的猾瘸,但是打印的結(jié)果卻沒(méi)有交換界赔,如果是拷貝的方式新生成一個(gè)對(duì)象,那么在調(diào)用changeValue()的時(shí)候就當(dāng)然不會(huì)影響原先變量的值牵触,但是事實(shí)卻是改變了淮悼。。揽思。偶槽袜腥。。钉汗。
查了許多資料以后得出結(jié)論羹令,Java的確是拷貝方式傳遞參數(shù)的,然而损痰,此拷貝卻跟C++有本質(zhì)的不同福侈,C++拷貝時(shí)候會(huì)新建一個(gè)對(duì)象,成立新的數(shù)據(jù)塊卢未,但是Java卻是更類(lèi)似于C++的指針傳遞肪凛,在傳遞參數(shù)時(shí)候相當(dāng)于拷貝了一個(gè)地址指針,因此辽社,在swap()函數(shù)里面更改x變量指針指向的對(duì)象不會(huì)影響到原先的a變量伟墙,在changeValue()中由于a和x指向的是同一個(gè)對(duì)象因此a指向的私有數(shù)據(jù)的變化當(dāng)然會(huì)影響到x。
哈哈哈滴铅,苦逼的C++轉(zhuǎn)Java程序猿~~~