黑马程序员技术交流社区
标题:
关于地址引用的问题?求大神解答~~谢谢~~
[打印本页]
作者:
rebirf
时间:
2016-11-22 17:13
标题:
关于地址引用的问题?求大神解答~~谢谢~~
public class Test01 {
public static void main(String[] args) {
Test t = new Test();
t.i = 5;
t.j = 6;
t.test(t);
System.out.println("t.i=" + t.i + ",t.j=" + t.j); // t.i=5,t.j=6 请问为什么是这个结果?
Test t1 = new Test();
t1.i = 7;
t1.j = 8;
t = t1;
System.out.println("t.i=" + t.i + ",t.j=" + t.j);// t.i=7,t.j=8
}
}
class Test {
int i;
int j;
void test(Test t) {
Test b = new Test();
b.i = 1;
b.j = 2;
t = b;
}
}
作者:
rebirf
时间:
2016-11-22 17:15
如上代码,为什么第一次打印会出现 t.i=5,t.j=6的结果,而不是 t.i=1,t.j=2 ??? 求解 谢谢~~~
作者:
rebirf
时间:
2016-11-22 17:28
额~我明白了,是java按值传递的一个概念~~~
作者:
文明密码
时间:
2016-11-24 15:38
怎么就是按值传递了?这是引用传递好不好?第一个结果为 5 6 是因为在方法中把b的引用传递给了t,但是在执行完方法后 这个引用就没用了 ,会自动断开,这时候t仍然指向它原来的堆内存地址,所以方法并没改变t的属性值,而下面一个是因为把t1的引用传递给了t,这不是方法,这个引用会一直保持,而t原来指向的堆内存失去了引用关系就会变为垃圾,等待GC回收,这时候t的指向的堆内存就是t1指向的地址,所以这时候你输出t或者t1都是一样的结果7 8,送你一个知识点:引用传递的根本就是一块对内存地址同时被多个栈内存所指向(栈内存,堆内存是沿用c体系语言而来方便理解,java中没用指针,但是可以参考理解),我回答这么详细,柳柳桑会不会送我一技术分呢?
作者:
aA772807986
时间:
2016-11-24 17:28
文明密码 发表于 2016-11-24 15:38
怎么就是按值传递了?这是引用传递好不好?第一个结果为 5 6 是因为在方法中把b的引用传递给了t,但是在执 ...
厉害厉害!
作者:
1413157322
时间:
2016-11-24 22:29
简单点说吧,如果把test(Test t)方法的参数名该一下你应该就好理解一点:
void test(Test t2) {
Test b = new Test();
b.i = 1;
b.j = 2;
t2 = b;
}
//(t2=t)t2只是属于test方法里面的对象,当方法弹栈时t2也随之消失。根本就不会影响对象t
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2