当前位置:编程学习 > JAVA >>

引用那点问题

今天才发现,原来这样改变不了引用,各位高手能否解释一下?

class Test{
    private int t;
    Test(int t){this.t = t;}
    static void changeRef(Test test){
        //我知道,如果在这里改变t的成员变量值,是可以的。
         //比如:test.t = 1;
        test = new Test(1);//我理解是这里会指向新的对象,但是从结果来看,没有影响到传进来的那个引用     
    }
    public static void main(Sring[] args){
        Test test = new Test(2);
        changeRef(test);
        System.out.println(test.t);//发现这里还是输出2,也即引用没有改变。各位能否解释一下其中的知识点?    }
}
--------------------编程问答--------------------

 test = new Test(1);

这会,这个"test"就和方法外的test没有什么关系了! --------------------编程问答-------------------- 有那么一篇帖子,火龙果给画过图,但我后来找不见了,一看那张图,就一下子清楚了。 --------------------编程问答--------------------
引用 1 楼 nmyangym 的回复:
Java code?1 test = new Test(1);
这会,这个"test"就和方法外的test没有什么关系了!

嗯 --------------------编程问答--------------------
引用 1 楼 nmyangym 的回复:
Java code
?



12

 test = new Test(1);
这会,这个"test"就和方法外的test没有什么关系了!

也即这种情况和传基本数据类型的时候情况是相同的? --------------------编程问答-------------------- java没有引用传递 --------------------编程问答--------------------
引用 4 楼 BaronZ 的回复:
引用 1 楼 nmyangym 的回复:Java code
?



12

 test = new Test(1);
这会,这个"test"就和方法外的test没有什么关系了!
也即这种情况和传基本数据类型的时候情况是相同的?

我个人理解是的。

假设基本类型 x,调用方法把方法外的变量x,作为实参传给方法后,方法里的变量x的值是和外面的一样的 。只要不给这个x重新赋值,那它的值就合外边的一样。

--------------------编程问答-------------------- 楼主你还没找到问题吗?
当Test test = new Test(2);是test指向的是第一个创建的Test对象
当调用changeRef(test)是虽然新创建了一个新的对象,引用也指向了新的对象,但是由于第一次创建的对象没有销毁,changeRef方法调用完毕后还是指向的第一个对象,不知这样解释是否通 --------------------编程问答-------------------- 后来想了想,xodbc说的是对的,java里面没有引用传递,只有值传递(此处是test无论在changeRef方法内如何改变引用,始终指向的是第一次创建的对象) --------------------编程问答-------------------- package learn.java;

public class TestRef{
    private int t;
    TestRef(int t){this.t = t;}
    static void changeRef(TestRef test){
        test = new TestRef(1); //break point 2
    }
    public static void main(String[] args){
        TestRef test = new TestRef(2);//break point 1
        changeRef(test);
        System.out.println(test.t);
}

在break point 1出添加断点后单步执行,并观察test这个变量的名字,执行到断点时test为learn.java.TestRef@bb7465。当执行到第二个断点时test为learn.java.TestRef@860d49 。所以虽然两个名字相同,但是第一个test并没有把引用赋给第二个test。因此虽然进行的传址操作。但是两个test分部指向了自己相应的实例。

--------------------编程问答-------------------- 呵呵 很简单的 changeRef(test); 你可以看成是把刚创出来的对象引用test当成一个参数传给了这个方法,然后这个方法接受到了这个参数此时这个参数(就是引用)指的是你刚才创出来的那个对象的地址。可是你后来又创建出来了一个新的对象即把这个参数(引用)由原来指向的地址指向到了刚创建出来的那个对象的地址上,所以此时你这个参数(引用)已经不在指向原来对象的地址,而指向了一个新对象的地址,所以你对新对象的地址里面的内容发生改变而不影响原来地址里面的对象。。。。。。我想想图怎么画哈,哈哈我自己画的比较搓。。。。 --------------------编程问答--------------------
引用 10 楼 chengxu2011 的回复:
呵呵 很简单的 changeRef(test); 你可以看成是把刚创出来的对象引用test当成一个参数传给了这个方法,然后这个方法接受到了这个参数此时这个参数(就是引用)指的是你刚才创出来的那个对象的地址。可是你后来又创建出来了一个新的对象即把这个参数(引用)由原来指向的地址指向到了刚创建出来的那个对象的地址上,所以此时你这个参数(引用)已经不在指向原来对象的地址,而指向了一个新对象的地址,所以你……

兄弟,你这看起来有点绕。但是看你这么认真回复,分少不了:) --------------------编程问答--------------------
引用 11 楼 BaronZ 的回复:
引用 10 楼 chengxu2011 的回复:
呵呵 很简单的 changeRef(test); 你可以看成是把刚创出来的对象引用test当成一个参数传给了这个方法,然后这个方法接受到了这个参数此时这个参数(就是引用)指的是你刚才创出来的那个对象的地址。可是你后来又创建出来了一个新的对象即把这个参数(引用)由原来指向的地址指向到了刚创建出来的那个对象的地址上,所以此时你这个参数(引用)已经不在……

不绕啊,光看图就很清晰了。
其实还是对象和对象引用的区别
形参test只是对象的引用,test=new Test(1);是对引用的操作,让它变成了另外一个对象的引用。
而对实参test没有影响。
说到底还是传值,只不过类类型传的是引用的值 --------------------编程问答--------------------
引用 12 楼 abc41106 的回复:
引用 11 楼 BaronZ 的回复:引用 10 楼 chengxu2011 的回复:
呵呵 很简单的 changeRef(test); 你可以看成是把刚创出来的对象引用test当成一个参数传给了这个方法,然后这个方法接受到了这个参数此时这个参数(就是引用)指的是你刚才创出来的那个对象的地址。可是你后来又创建出来了一个新的对象即把这个参数(引用)由原来指向的地址指向到了……

--------------------编程问答--------------------
引用 6 楼 nmyangym 的回复:


引用 5 楼 xodbc 的回复:
java没有引用传递


引用 7 楼 xulong1 的回复:


引用 9 楼 Tao_QQ 的回复:


引用 10 楼 chengxu2011 的回复:


引用 12 楼 abc41106 的回复:


引用 13 楼 lovemanyue 的回复:


大家好,今天看到一篇文章,问题解决了,java方法参数的传递是值传递,不是引用传递。楼上有的人已经已经知道了,也有回答不错的,稍后结帖。
不知道的请看这篇文章,就明白了。
我自己写的理解
补充:Java ,  Java SE
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,