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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 希望的曙光 于 2013-1-5 10:48 编辑

     public void call(Test t) {
           Test t2 = new Test();
           t2.setName("cba');
           t.setName("abc");
           t = t2 ;
        }

        public static void main(String[] arg) {
       Test obj = new Test();
           call (obj) ;
           System.out.println("obj"+obj.getName());
        }
       这个时候,你们可以发现,打印出来的是"abc" ,而不是"cba",原因是这样的,在这次调用中,等于声明了两个变量obj , t,它们指向的是同一个地址,调用call方法,只是将obj指向的地址传递给了t,而obj本身并没有传递过去(也就是没有传递引用),当你重新赋值的时候(也就是将对象引用指向其他存储空间),等于只影响了t,而没有影响obj。

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1

查看全部评分

4 个回复

倒序浏览
java中方法的参数传递方式只有一种:值传递。对于引用型变量,也是值,就是传递地址值,t把obj所存的地址复制了一份放到自己里面,设置t为abc,因为t与obj引用同一对象,所以obj也为abc,所以输出obj为abc。
就是你分析的那样

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1

查看全部评分

回复 使用道具 举报
嗯,你的分析是对的啊,参数传递都是值传递,要么是地址值,要么是基本数据类型的值。
回复 使用道具 举报
当然是了,t2又新开一个空间,又没有被指向 ,而t是经过main 方法传进去 被指向的。
至于 让t = t2 你让空间互相赋值并没没有意义啊,也不会指向具体属性的赋值,结果肯定不会变化 abc必须的啊

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1

查看全部评分

回复 使用道具 举报
这个有点意思 其实是这样的

public void call(Test t) {
           //因为方法参数方法是值传递,等于是创造了一个和实参同名的引用指向同一个对象的变量,所以无论
       在方法内怎么改变实参变量所指向引用,实际上方法外部创建的作为实参的变量的真实引用都不会改变,
       还会指向原来的对象。
          Test t2 = new Test();
           t2.setName("cba');
           t.setName("abc");
           t = t2 ;
        }

        public static void main(String[] arg) {
       Test obj = new Test();
           //这里因为是值传递,传递的只是引用,而这里的obj其实只是临时复制的变量,关于它的改动对外面的obj毫无影响,
       只有改动他们所相同的共同指向的对象,才能对外面的obj输出结果产生影响
           call (obj) ;
           System.out.println("obj"+obj.getName());
        }

综上所述,这里的call方法并未实际改变实参所引用的对象,它只是将配给传递进来引用的变量的引用再次转向了另一个新创建的对象,
而这个变量和外边的obj实际上可当做两个变量看,因此自然不会对外面的obj产生影响。
对于  public void call(Test t) {
           Test t2 = new Test();
           t2.setName("cba');
           t.setName("abc");
           t = t2 ;
        }

而言,引用被改变的只是方法内的局部变量t,而非在方法外创建的作为实参的变量。

我想LZ的纠结应该在于看视频时,会产生引用值传递会影响实参的值,而基笨类型值传递不会改变的错觉吧,实际上除非直接改变
实参原本所引用的对象的值,那么值传递对引用类型的值同样毫无改变,

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马