当一个对象被当做参数传递到一个方法后,此方法可改变这个对象的属性,并可以返回变化后的结果,那么这里到底是值传递还是应用传递?
解决方案 »
- struts2.2.1.1有关dtd提示问题
- 怎么查一个网站是用什么数据库的?
- 高手求救 SSH框架错误!
- htmlparser用法问题
- 存在threadLocal里面的httpSession,过了一分钟之后怎么就没有啦
- Spring+hibernate 获取bean出现空指针错误!请大家指点,我是初学者
- HQL 一个非常郁闷的查询问题
- 任何域名只要指向我的IP就能访问我的网站,Apache,怎么限制?
- 请问,如何发布java应用?
- 300分大贴,血泪相送......
- 【结贴率100%高分求解】WEBSERVICE取byte[] 内存溢出问题 (大概是这样)
- 运行struts2工程时,启动tomcat报错原因求解!!!!
public Object fun(Object obj)
{
return obj;}
对象的内容可以在被调用的方法中改变,但对象的引用是不会改变的。
其实分配了两块内存,一个是A a1,在栈里(所谓的引用),还有一个new A()在堆里(所谓的对象),栈中的内容就是堆的地址。可以把a1看成是北京路上的一块指路牌,指向了火车站。
A a2 = a1; (方法参数与之类似)
分配了一个新的栈内存(南京路上的指路牌),同样指向刚才那个地址(火车站)。
这个时候,进行a1.x = 5操作(类似指着北京路上的指路牌说,“去,把那个火车站的站台增加到5座”),同样会影响a2.x(因为是同一个,类似在完成上面所说的增加站台数量后,指指南京路上的指路牌问:“这个火车站有多少站台”)
如果再进行a2 = new A();
此时,又分配了一个新的堆内存(造了一座新的火车站),同时把刚才a2所在栈内存(南京路上的指路牌)中的内容改为了新的堆(新的火车站)地址。
如果再对a1.x = 100操作,再也不会影响a2.x,因为a1,a2已经指向两个堆对象了(两块各自指向不同的火车站的指路牌) --------------- 对于基本类型,int...
由于栈内存中的数据不是指向堆内存地址的指针/引用(它们就是自己,不是什么指路牌),而是实实在在的数值,因此它们就是属于所谓按值传递。改变任何一个栈内存中的数据,影响的只是这个变量本身的值。 ---------------
当然,上面对于栈、堆的描述是为了便于理解而简单化的。比如,也有引用及数值的位置是在堆中(依语言不同,可能略有差别,位于栈中的引用主要是局部变量,参数等,位于堆中的引用主要是成员/全局变量),但原理类似(同样可以使用指路牌-火车站的例子,可以想象成放在火车站中的指路牌)