愚人节,散分。顺便回个让人难受的传值问题

ZangXT 2010-04-01 02:06:19
首先祝大家节日快乐!
String,传值之类的问题总是经久不衰的,无聊,画了几张图(基本示意,不考虑具体实现,字节对齐等)

变量就是内存区,==比较的是变量的内容。
int a = 5;
int b = a;
Object c = new Object();
Object d = c;

a和b是基本类型,所以直接保存值。c和d保存引用。引用到底是什么,依赖于具体虚拟机的实现,目前大部分虚拟机选择的是直接使用指针,即地址。
上面语句之后,你让a = 8,自然不会影响b,因为b存的是值,a是什么它不知道。让c再赋值一个新对象,自然也不会影响到d,同理。所以,基本类型和引用类型从这里看没有什么区别。
使用==判断时,只要看一下内存里的数据是不是一样就可以了,可以认为是简单的值比较。

关于传参,权威书籍会告诉我们,java里只有pass by value。
void test(int a,String str,StringBuilder builder){
a = 8;
str = "abc";
builder.append("modify");
builder = new StringBuilder("test");
}

调用
int a_src = 1;
String str_src = "source";
StringBuilder builder_src = new StringBuilder("source");
test(1,str_src,builder_src);
调用前内存:

调用时,先复制参数。所有参数copy一份:

执行
a = 8;
str = "abc";
builder.append("modify");

之后:


a = 8; str = "abc";自然不会影响a_src和str_src了。【注意这里和String是否是可变类没有半毛钱关系】

builder.append("modify");这个因为改变了builder内容(此时和builder_src一样)所引用的对象,再通过builder_src看对象时,自然会发现变化。
执行builder = new StringBuilder("test");之后:

改变了builder这个变量的内容,关builder_src何事?
...全文
274 38 打赏 收藏 转发到动态 举报
写回复
用AI写文章
38 条回复
切换为时间正序
请发表友善的回复…
发表回复
SealedBook 2010-04-02
  • 打赏
  • 举报
回复
接一接分
dreamhunter_lan 2010-04-01
  • 打赏
  • 举报
回复
默默接分就好
BigBird2012 2010-04-01
  • 打赏
  • 举报
回复
我来好好看看,。。。。。。。。。
alpha 2010-04-01
  • 打赏
  • 举报
回复
== 和 equals的 经典问题啊
kaylg 2010-04-01
  • 打赏
  • 举报
回复
求分来的
laorer 2010-04-01
  • 打赏
  • 举报
回复
我只是接分的....
kokobox 2010-04-01
  • 打赏
  • 举报
回复
[Quote=引用 31 楼 bao110908 的回复:]

引用 15 楼 kokobox 的回复:
为什么现在技术贴都发到非技术区了?


因为非技术帖都发到技术区去了!
[/Quote]

上午已经移到非技术区去了!
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 kokobox 的回复:]
为什么现在技术贴都发到非技术区了?
[/Quote]

因为非技术帖都发到技术区去了!
  • 打赏
  • 举报
回复
非常感谢
ladybirds2008 2010-04-01
  • 打赏
  • 举报
回复
你们 是真厉害 我早就说了 这个是没完没了的问题。。。。
哎。。只有自己遵循自己的一套想法 就ok啦
longtenggdf 2010-04-01
  • 打赏
  • 举报
回复
看了你的文章收获太多了,非常感谢。
pengzhistar 2010-04-01
  • 打赏
  • 举报
回复
接分来了
longtenggdf 2010-04-01
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 zangxt 的回复:]
http://blog.csdn.net/ZangXT/archive/2009/08/05/4410246.aspx

引用 19 楼 longtenggdf 的回复:
引用 17 楼 zangxt 的回复:
引用 15 楼 kokobox 的回复:
为什么现在技术贴都发到非技术区了?

这种内容纯属灌水了。

你们搞清楚了的都去灌水了。没搞清楚的就很郁闷了。
LZ,我问下,……
[/Quote]
我发现我之前就是看了你那里面引用的黑色部分。。
yanzhexian 2010-04-01
  • 打赏
  • 举报
回复
我承认我是来拿分的...
WYhack 2010-04-01
  • 打赏
  • 举报
回复
基本算是终于有那么点清楚了!
qybao 2010-04-01
  • 打赏
  • 举报
回复
其实这个问题,在于理解的人怎么认识这个地址这个概念
比较地址并不是说比较两个变量自己的地址,而是比较两个变量自己的地址里所存的那个地址,从某种意义上来说,所谓的所存的那个地址也可以说是一个值,只是因为我们习惯于用对象来说这个值,而对象在内存中表现为一个地址(即C所说的指针),所以就有了比较地址这一说法
BearKin 2010-04-01
  • 打赏
  • 举报
回复
如果还有疑问的我去抄书..这事情还要麻烦ZANGXT大哥亲自出马

ZangXT 2010-04-01
  • 打赏
  • 举报
回复
http://blog.csdn.net/ZangXT/archive/2009/08/05/4410246.aspx
[Quote=引用 19 楼 longtenggdf 的回复:]
引用 17 楼 zangxt 的回复:
引用 15 楼 kokobox 的回复:
为什么现在技术贴都发到非技术区了?

这种内容纯属灌水了。

你们搞清楚了的都去灌水了。没搞清楚的就很郁闷了。
LZ,我问下,对于基本类型,栈中会保留若干份拷贝呢 还是一份。我差一点就完全明白了。
[/Quote]
zings 2010-04-01
  • 打赏
  • 举报
回复
厉害 我也要 深入JVM...///
longtenggdf 2010-04-01
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 zangxt 的回复:]
引用 15 楼 kokobox 的回复:
为什么现在技术贴都发到非技术区了?

这种内容纯属灌水了。
[/Quote]
你们搞清楚了的都去灌水了。没搞清楚的就很郁闷了。
LZ,我问下,对于基本类型,栈中会保留若干份拷贝呢 还是一份。我差一点就完全明白了。
加载更多回复(18)

23,404

社区成员

发帖
与我相关
我的任务
社区描述
Java 非技术区
社区管理员
  • 非技术区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧