值传递与引用传递

一般数据类型(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,但是,在栈上看来,stringBuidlers 是两个不同的地址,在执行 s.append(",haha"); 时,stringBuidlers指向的是堆上的同一个地址,所以 s 可以修改 new StringBuilder("yui") 实例的值。执行 s = new StringBuilder("hello,bitch") 赋值语句时,只是把方法内部声明的 StringBuilder s 变量指向新的堆地址 StringBuilder("hello,bitch"),但栈上的 stringBuilder 仍然指向 new StringBuilder("yui")

引用传递只是传递 实参指向的堆地址 而不是传递 实参栈上地址的引用

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容