http://community.csdn.net/Expert/FAQ/FAQ_Index.asp?id=211634
网上文章都说是传值,有文章如下说
当你向一个方法传递一个对象时,Java没有把对象放入堆栈,它只是拷贝对象的引用然后将这个引用的拷贝放入堆栈。也就是说,根据定义,Java使用的是传值方式。
可是我做试验,怎么觉得是传的引用呢
代码如下
Foo.java
public class Foo {
public int bar;
}
Test.java
public class Test {
public static void main(String []args) {
Foo f = new Foo();
f.bar = 5;
System.out.println("f.bar=" + f.bar);
func(f);
System.out.println("f.bar=" + f.bar);
}
public static void func(Foo p) {
p.bar = 6;
}
}
输出结果是
f.bar=5
f.bar=6
对象在方法中被改变,这不是传引用的结果吗
---------------------------------------------------------------
基本对象传递的是值,这是毫无疑问的
非基本对象传递的是引用,但这个引用本身是通过值传递来实现的
例如:
public static void tripleSalary(Employee x)
{
x.raiseSalary(100);
}
调用
test=new Employee(...);
tripleSalary(test);
将改变对象中的数据的值,因为此时test和x都指向相同的对象
但是例如:
public static void swap(Employee x,Employee y)
{
Employee temp=x;
x=y;
y=temp;
}
调用
Employee a=new Employee(...);
Employee b=new Employee(...);
swap(a,b);
是不会改变x,y指向的对象的,尽管a和x、b和y指向的是相同的对象,但a,b仅仅是x,y的拷贝
这与c++中的引用a=&x是不同的