一般数据类型(byte,char,int,float,double,long,String,Integer,Long,Float,Double)是值传递,也可以称为拷贝传递,即拷贝实参的值然后初始化形参;其他的(Object)是引用传递,即传递地址,引用传递形参可以修改实参实例成员的值,但不能借助重新给形参赋值而间接地让实参指向一个新的堆地址。
private void f3(StringBuilder s) {
s.append(",haha");
s = new StringBuilder("hello,bitch");
}
StringBuilder stringBuilder = new StringBuilder("yui");
f3(stringBuilder);
System.out.println(stringBuilder);
output:
yui,haha
可以用 帧栈
或者 全局变量和局部变量
来解释:
f3()的方法形参为 StringBuilder s
,可以理解为在f3()函数的内部声明一个 StringBuilder s
变量,当执行 f3(stringBuilder)
调用操作时,实际上是用实参 StringBuilder stringBuilder
指向的堆 new StringBuilder("yui")
的 地址
来初始化 s
,但是,在栈上看来,stringBuidler
和 s
是两个不同的地址,在执行 s.append(",haha");
时,stringBuidler
和 s
指向的是堆上的同一个地址,所以 s
可以修改 new StringBuilder("yui")
实例的值。执行 s = new StringBuilder("hello,bitch")
赋值语句时,只是把方法内部声明的 StringBuilder s
变量指向新的堆地址 StringBuilder("hello,bitch")
,但栈上的 stringBuilder
仍然指向 new StringBuilder("yui")
。
引用传递只是传递 实参指向的堆地址
而不是传递 实参栈上地址的引用
。