test a = new test();意思是在内存地址中定义了a的对象,并将对象a通过值传递的方式传 给了b,因此b.i=2可修改a的对象。
b=t实际上是将t的内存地址付给了b,此时a与b的内存地址是不相同的所以打印的结果就会不同
b=t实际上是将t的内存地址付给了b,此时a与b的内存地址是不相同的所以打印的结果就会不同
解决方案 »
- 在java中向CICS客户端发送消息报IOException。
- spring和hibernate整合除了getHibernateTemplate()还能用什么
- 帮忙找错
- utf-8乱码,求助
- spring+hibernate 的问题
- 除了head first java外,我还改看什么书?
- 在线等大哥哥和大姐姐们解决哈一个关于EJB的问题.
- 为什么dom level3 中element的getTextContent() 方法不能用?
- 我生成了一个doucement对象,如何用SAX解析?
- struts中在执行完一个Action后同时刷新两个页面?
- 高薪急聘JAVA高级程序员
- 简单问题(在线)(马上给分)!!!
首先Java的参数传递也是传值和传引用混合的。对于简单数据类型是是传值的,对于对象是传引用的。Test是一个类,如果Test作为参数传递时一定是传引用的。
看aMethod,a保存着Test一个实例的地址,a本身应该是一个整数类型。把实例传递给bMethod时,bMethod也获得了这个实例的地址。但是,JVM传递的是a的值(即实例的地址),也就是说JVM把这个地址复制了一份,再用这个副本去完成函数调用,至于最后又用副本去保存别的地址,对于a本身自然不会有任何影响。在传递是,把b看作a的副本就OK了。
a----->Test(100)
|
| bMethod(a),设想a本身的一个副本b传到了bMehtod.
|
a----->Test(100)
b----->Test(100)
| b.i = 2;
a----->Test(2)
b----->Test(2)
|
| Test t = new Test();
|
a----->Test(2)
b----->Test(2)
t----->Test(100)
|
| b = t;
|
a----->Test(2)
b----->Test(100)
t----->Test(100)
|
|
|
Result:a.i=2;b.i=100
看样子,想深入了解JAVA,还得对底层的知识有所了解才行。以前我也学过C++,对指针部会投入的精力比较多。但没有在实际的工作中用到,所以经常会在这种问题上迷惑。
看样子,还得学学C++呀,不过C++的广博的千变万化语法、和对底层的依赖,实在是难以超越,不知各位有无比较好的方法?
在bMethod(Test b)中,b是a的别名,他们都指向同一个对象,所以对b的操作与对a的操作相同。但对于b=t是把b指向了新的对象t,因此b与a就没有关联了。
这样的解释我决得更合理