//示例1:对象类型
public class PassReferByValue
{
String a = "123";
public static void test(PassReferByValue test)
{
test.a = "abc";
}
public static void main(String[] args)
{
PassReferByValue test = new PassReferByValue();
System.out.println("对象的数据的初始值是:" + test.a); //123
test(test);
System.out.println("通过调用test方法修改对象的数据的值之后:" + test.a); //abc
}
}
总结:因为是对象类型,所以方法每次修改对象的数据的值之后,都在方法之外生效了,也就是说,在方法之外和在方法之内访问到的对象的数据的值是一致的。
//示例2:String类型
public class Test
{
public static void test(String str)
{
str = "word";
}
public static void main(String[] args)
{
String string = "hello";
System.out.println("对象的数据的初始值是:" + string); //hello
test(string);
System.out.println("通过调用test方法修改对象的值之后还是以前的值:" + string); //hello
}
}
示例一确实是对对象的数据的修改
,但是示例二却是对参数本身的修改
了
不管是值传递还是引用传递,其实本质上都是值传递
,方法调用的时候 计算出参数的值,拷贝一份给对应的参数
只是对于对象类型,传递的是对象的引用(或者理解为指针,地址)值,虽然参数拿到的是拷贝的引用,但是和原引用指向的是同一个对象,因此根据这个引用可以操作到原对象的数据
你的示例二中,调用方法时,计算参数string
的值(可以理解为hello
这个字符串对象在内存中的地址),拷贝给参数str
,参数str
虽然拿到了原来hello
字符串对象的引用(即str
的值等于string
的值,也即hello
的地址),但是立马给这个参数重新赋值,这个时候str
参数已经跟hello
字符串没有任何关系了,str
不再指向hello
,改指向world
了,但是这个过程中hello
自身以及hello
在内存中的地址没有任何变化,方法外部的string
变量也一直指向hello
这个字符串对象,没有任何变化