A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

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;
        }
}

5 个回复

倒序浏览
如上代码,为什么第一次打印会出现 t.i=5,t.j=6的结果,而不是 t.i=1,t.j=2 ??? 求解 谢谢~~~
回复 使用道具 举报
额~我明白了,是java按值传递的一个概念~~~
回复 使用道具 举报
怎么就是按值传递了?这是引用传递好不好?第一个结果为 5  6 是因为在方法中把b的引用传递给了t,但是在执行完方法后 这个引用就没用了 ,会自动断开,这时候t仍然指向它原来的堆内存地址,所以方法并没改变t的属性值,而下面一个是因为把t1的引用传递给了t,这不是方法,这个引用会一直保持,而t原来指向的堆内存失去了引用关系就会变为垃圾,等待GC回收,这时候t的指向的堆内存就是t1指向的地址,所以这时候你输出t或者t1都是一样的结果7  8,送你一个知识点:引用传递的根本就是一块对内存地址同时被多个栈内存所指向(栈内存,堆内存是沿用c体系语言而来方便理解,java中没用指针,但是可以参考理解),我回答这么详细,柳柳桑会不会送我一技术分呢?
回复 使用道具 举报 1 0
文明密码 发表于 2016-11-24 15:38
怎么就是按值传递了?这是引用传递好不好?第一个结果为 5  6 是因为在方法中把b的引用传递给了t,但是在执 ...

厉害厉害!
回复 使用道具 举报
简单点说吧,如果把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
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马