在java中,只有“值传递“一种参数传递方式。
1. 按值传递和按引用传递
定义按值传递和按引用传递
这两个术语是重要的。按值传递意味着当将一个参数传递给一个函数时,函数接收的是原始值的一个副本。因此,如果函数修改了该参数,仅改变副本,而原始值保持不变。按引用传递意味着当将一个参数传递给一个函数时,函数接收的是原始值的内存地址,而不是值的副本。因此,如果函数修改了该参数,调用代码中的原始值也随之改变。
2.
对象(object)与引用(reference)
我们知道:
A a = new A();
产生一个A类型的对象,a是这个对象的的一个引用,即a指向heap中真正的对象,而a和其他基本数据类型 一起存放在stack中.也就是object通过reference操控,在底层的话,a更象一个指针.
3.一个帮助理解的例子:
public class PassTest
{
float ptValue;
public void changeInt (int value)
{
value = 55;
}
public void changeStr (String value)
{
value = new String ("different");
}
public void changeObjValue (PassTest ref)
{
ref.ptValue = 99f;
}
public static void main (String args[])
{
String str;
intval;
PassTest pt = new PassTest ();
val = 11;
pt.changeInt (val);
System.out.println ("Int value is: " + val);
str = new String ("Hello");
pt.changeStr (str);
System.out.println ("Str value is: " + str);
pt.ptValue = 101f;
pt.changeObjValue (pt);
System.out.println ("Current ptValue is: " + pt.ptValue);
}
}
这个程序最后输出的结果将是:
11
Hello
99f
对于int类型的参数11, 虽然改变了形参的值,但是实参却不改变,这同C语言中是一样的。
对于String 类型的变量 str,因为在java中String作为对象来处理,参考上面的分析,str是"hello"的一个引用(指针),按照值传递的说法value是str的一个副件,因此也是一个引用。但是他经过value = new String ("different");被修改后value指向了一个新的对象。所以str所指的内容没有被改变。
pt是主函数中创建的PassTest的对象,通过传递它,就可以完成地址的传递,子函数中,ref与主函数的pt指向的其实是一个内存单元,那么修改 ref中的ptValue的值,也就是修改pt中的ptValue的值,即使没有最后的数据返回,这个数据也是会改变的。
我们要记住,a只不过是对象的reference,而reference的复件与原来的reference指向的是同一个对象 我们对复件的操作,与对a的操作一样,最终还是对指向对象的操作,因此,java的参数,只有值传递.