String对象是不可变的,在String对象作为参数传递时,它本身的数值是不会随着形参的值改变而改变的,如:
public class Method{
String str = new String("good"); //创建了一个String对象
char[] ch = {'a','b','c'};
public static void main(String[] args)
{
Methodex=new Method();
ex.change(ex.str,ex.ch);
System.out.print(ex.str+"---");//good---
System.out.print(ex.ch);//gbc
}
public void change(String str,char ch[])
{
str="test ok";//重新创建了一个对象,本身的String对象的值没有变化
ch[0]='g';//改变引用数组中的值
}
}
String与数组对比来看,可以说成String对象的参数传递是引用类型传递的特殊形式。
至于 Integer:
理解这里的关键是区分对象和引用。 这里声明的integer是一个引用,而不是一个对象(只是Java把它设计为看上去好像是对象一样)。这个引用它指向了一个对象,这个对象就是后面用new关键字生成的对象。因此,可以说integer指向了一个Integer对象。
在调用test方法的时候,程序将 integer 作为参数传递给 add 方法了。这里仍然是值传递,在 add 调用过程中,会产生一份新的引用(不妨叫做y)。此时,integer 和y指向了同一个对象。
integer 和 y 指向的是同一个对象, 由于Java的设计,我们可以通过操作引用来达到操作对象的目的。因此,如果我们此时使用y来修改对象的属性 (例如,y.someField++); 你可以看到 integer 指向的对象同时也被修改到了。
另一方面,如果我们让 y 指向另外一个对象, y= num++; 此时 integer 和y就指向了不同的对象。y修改了它指向的对象的属性,很显然不会影响到 integer 指向的对象 |