public class Test4 {
Vector v = null;
public Test4(){
newVector(v);
}
public void newVector(Vector v){
v = new Vector();
}
public static void main(String[] args) {
Test4 t = new Test4();
System.out.println(t.v == null);
}
}上面的方法,不是引用传递吗 ? 怎么打印结果为true
求解释到底什么才是引用传递

解决方案 »

  1.   

    翻译成c++后,你理解一下
    void newVector(Vector ** v){
            *v = new Vector();
        }
    等价于
    void newVector(Vector * &  v){
            v = new Vector();
        }函数参数传进来是临时变量,临时变量的值copy了你的参数值,所以在函数内部赋值后不能返回。
    如果需要返回,需要是指向指针的指针(第一个例子),或者是引用(第二个例子),但是java的引用和c++的引用概念不同,java的引用可以理解为指针
      

  2.   

    结果当然是true,因为你从来就没给v赋值啊我估计根据你的本意例子少了一行代码,应该如:
            Test4 t = new Test4();
            t.newVector(new Vector());
            System.out.println(t.v == null);但这样结果仍然会是true
    因为newVector()方法中被赋值的v和参数同名,它被编译器理解为参数变量v,所以实例变量v仍然不会被赋值
      

  3.   

    这样写结果就是false了    public void newVector(){
            v = new Vector();
        }
      

  4.   

    那可以通过修改newVector(Vector v)方法,通过此方法传进成员变量v ,让它直接对成员变量v修改。 
      

  5.   

    你没给VECTOR赋值,就是没有调用newVector的方法,当然为空了
      

  6.   

    方法里的参数只是形参,顾名思义,形式参数,只是一个形式,在方法里变来变去,当方法结束了,它的生命周期也就结束了,就消失了,所以,如果你需要方法帮你做什么事,然后还给你一个结果,那么,你需要把想要的东西return出来,要不然就跟着方法的死亡一起死亡了
      

  7.   


    public class Test4 {
    Vector vector = null;
    public Test4(){
    newVector(vector);
    }
    public void newVector(Vector v){
    v = new Vector();
    }
    public static void main(String[] args) {
    Test4 t = new Test4();
    System.out.println(t.vector == null);
    }
    }不是不是。。
    我的意思是想把成员变量vector传到newVecor方法里面。在newVecor方法里面是直接对成员变量vector操作。
    在出了newVector方法以后,成员变量vector就被初始化了。
    能通过修改newVector方法实现吗?
      

  8.   


    好,你把成员变量名从v改成了vector,这样看就清楚多了。
    你可以这么理解
    vector可以看作个指向成员变量实例的引用
    在newVector方法中传进来的v也是个指向成员变量实例的引用
    即在刚进入方法时2个引用指向同一个实例对象
    然后v=new Vector()改变了v这个引用的值,令v指向一个新建的Vector
    此时vector仍指向原来的成员变量实例
    现在有两个引用,指向两个实例,所以t.vector仍然是null
      

  9.   

    传递的都是null,没有什么问题
      

  10.   

    这么跟你说把
    成员变量 vector是一个引用,传入newVector方法中的时候把自己复制了一份名字叫做v
    这个时候vector和v是两个引用,因为v是vector复制的,所以都指向null
    方法完成之后
    v引用指向了new Vector()对象
    但是vector还是指向null
    因为他们是不同的引用标识同时由于没有任何地方会再用到v引用的new Vector()对象
    所以他会被垃圾清理掉
      

  11.   

    自己对比下看看
    public class Test
    {
    Test4 t;
    private Test()
    {
    t = new Test4();
    newVector(t);
    }

    public void newVector(Test4 t)
    {
    t.v = new Vector();
    }

    public static void main(String[] args)
    {
    Test t1 = new Test();
    System.out.println(t1.t.v==null);
    }
    }class Test4
    {
    Vector v = null;
    }
      

  12.   

    楼主的例子是引用传递,没错的引用传递,在newVector方法中操作Vector,外边的Vector对象也会跟着变,并不是像上楼们说的那么“形参”,“成员变量”等等,要坚信自己的判断,java对于非基本类型(String除外)的传递都是引用传递。例子中,输出结果是true,是因为引用传递时,你并没有传递进去;传入时为null,这是一种特殊情况。特殊就特说在变量V是Test4类的成员变量,虽然通过引用传递,将引用重新分配了空间,但是方法调用完后,还会恢复为成员变量保存的引用值。当然,newVector方法中不重新分配空间,只是简单增删数据的话,是没有这问题的。这样的陷阱,好像Java比较著名的书《Java解惑》中讲到过,非常经典的一本书。
      

  13.   

    楼主你的代码等同于public class Test4 {
        Vector v = null;
        public Test4(){
            newVector(v);
        }
        public void newVector(Vector gagaga){ // 此处是gagaga
            gagaga = new Vector();
        }
        public static void main(String[] args) {
            Test4 t = new Test4();
            System.out.println(t.v == null);
        }
    }这样t.v仍然是null
    其实你的代码只要加个this就是false了public class Test4 {
        Vector v = null;
        public Test4(){
            newVector(v);
        }
        public void newVector(Vector v){
            this.v = new Vector();// 此处加个this
        }
        public static void main(String[] args) {
            Test4 t = new Test4();
            System.out.println(t.v == null);
        }
    }楼主有兴趣的话,可以看下我博客
    http://blog.csdn.net/niuniu20008/article/details/2953785
      

  14.   

    说白了你把参数v看成一个指针,原先指向比如a对象,然后new的时候其实只是把v指向了新的对象,而原来a对象还在那完全没变,也就是你成员变量v还是指向null的,只不过参数v指向了新的对象