您的位置:首页 > 编程语言 > Java开发

Java中的参数传递方式到底是引用传递还是值传递?

2009-04-13 14:18 661 查看
Java中的参数传递方式到底是引用传递还是值传递?

事实上,Java中方法参数传递的是原来对象引用的copy(副本)。如果你在方法中改变这个copy中的内容,因为这个copy也是指向原对象,所以改变会生效。给你带来好像Java中存在地址传递一样。而实际上当你对这个对象的引用进行操作,例如object = new SomeObject();这样的操作是无效的,因为你改变的是这个copy(副本),原来的引用还是指向原来的对象,并没有发生变化。

下面举个例子来进一步说明吧。

package com.parameter.transmission;

public class Person

{

public String name ;

public int age ;

public Person(String name, int age)
{
this.name = name;
this.age = age;
}

}

package com.parameter.transmission;

public class TestUseCase_1 {

public static void changeAttr(Person p)
{
p.name = "Alex" ;
p.age = 24 ;
}

public static void main(String[] args)
{

Person p = new Person("Bob" , 21) ;

//Output the attributes of p for the first time.
System.out.println("Name =:"+p.name+" | "+"Age =:"+p.age) ;

//Modify the attributes of p.
changeAttr(p) ;

//Output the attributes of p for the second time.
System.out.println("Name =:"+p.name+" | "+"Age =:"+p.age) ;

}

}


运行结果:

Name =:Bob | Age =:21

Name =:Alex | Age =:24

解释:

我们的目的是想通过changeAttr函数,改变被传入的实参Person对象的成员变量。按照C++的思想,如果对象是以传址方式进行参数传递,那么必然可以达到我们的目的。但是Java已经明确规定参数是以传值方式进行传递的,并且从上面这个例子中可以看出,我们也确实达到了预期的目标。

这是怎么回事?这是因为Java中方法参数传递的值就是原来对象的引用的副本。请注意,这里的引用并不是当初在Person p = new Person() ;语句中声明的p。而是p的一个副本,我们姑且假设这个副本为p2。因此我们在方法changeAttr中相当于是在使用p2对原对象进行修改。又由于p2是指向原对象的(因为p2==p),所以我们用p2对原对象进行的修改并不会因为程序退出了而失效。

但是如果我们现在想用一个函数来改变p所指向的对象,结果又将如何呢?请看下面的例子。

package com.parameter.transmission;

public class TestUseCase_2 {

public static Person newPerson = new Person("Alex" , 24) ;

public static void changeReference(Person p)
{
p = newPerson ;
}

public static void main(String[] args)
{
Person p = new Person("Bob" , 21) ;

//Output the attributes of p for the first time.

System.out.println("Name =:"+p.name+" | "+"Age =:"+p.age) ;

//Modify the attributes of p.
changeReference(p) ;

//Output the attributes of p for the second time.
System.out.println("Name =:"+p.name+" | "+"Age =:"+p.age) ;

}

}


运行结果:

Name =:Bob | Age =:21

Name =:Bob | Age =:21

解释:

我们企图在函数changeReference中改变实参p所指向的对象,结果却失败的。为什么呢?因为正向我们之前说的,函数changeReference中的引用只是原对象引用的一个副本,即p2,并不是p。既然如此,我们在函数中只是改变了引用p2所指向的对象,而没有改变引用p所指向的对象。所以才会有现在的运行结果。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐