我的理解:
1.基本数据类型=传值
2.对象(就是NEW出来的东西)=传址
咱们用实验说话~
public class Test2 {
private Vector<String> v;
public Test2() {
v=new Vector<String>(2);//给V分配空间
v.add("test");
}
public Vector<String> getVct(){
return v;//这里我假设它返回的是值~
}
public void resetVct(){
v=null;//把V清空
}
public static void main(String[] args) {
Vector<String> k;//这个K只是个什么都没有的引用吧~[是不是等同于null的引用?]
Test2 t=new Test2();
k=t.getVct();//K取得t.v的值拷贝[]
//k=t.v;
t.resetVct();//把t.v清空
System.out.println(k.size());//这里输出正常.虽然t.v没了,k还是有自己的空间地.
//System.out.println(t.v.size());
}
        }
然后注释掉[k=t.getVct()],启用[k=t.v]
这时k和t.v应该都是同一块空间的引用吧.
接着把t.v清空.
打印应该出NullPointerException吧???
可结果还是1.
把[System.out.println(t.v.size())]注释取消,结果是NullPointerException.
请各位指导下,我哪里出错了?

解决方案 »

  1.   

    根据你的叙述,把t.v清空时,t.v指向null,但是k是指向你建的vector的。所以和你第一种情况并没有什么区别。
    t.v已经是null了,当然不能调用size()方法了。所以是NullPointerException。
    如果不太明白,自己用debugger试试就知道了。
      

  2.   

    明白了.
    我以为t.v=null就是把t.v所指向的数据空间清空了,其实数据空间还在,还有一个k的引用指向它,只不过t.v这个引用变为指向null.
    另一个问题:
    如果这时我把k也设为null,那么那块数据空间是不是就变成垃圾了,会被回收?
      

  3.   

    对于传地址还是传地址   我的理解是   在堆栈里边用一个heap地点专门放new出来的东西   另外一块区域放引用和局部变量    就像楼上说的  方法里边进行值传递           比如你对一个int型的值进行包装  就是integer  这个时候就会new出来对象放到 heap里边,,,,,,他的值也会随着引用的指向而变化
      

  4.   

    在java中,基本数据类型和对象都是值传递,如下面交换两个对象的方法并不能实现对象的交换:
    public static void swap(Object o1, Object o2)
    {
        Object temp = o1;
        o1 = o2;
        o2 = temp;
    }o1,o2 只是得到了对象引用的拷贝,交换的只是这两个拷贝