我的理解:
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.基本数据类型=传值
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.
请各位指导下,我哪里出错了?
t.v已经是null了,当然不能调用size()方法了。所以是NullPointerException。
如果不太明白,自己用debugger试试就知道了。
我以为t.v=null就是把t.v所指向的数据空间清空了,其实数据空间还在,还有一个k的引用指向它,只不过t.v这个引用变为指向null.
另一个问题:
如果这时我把k也设为null,那么那块数据空间是不是就变成垃圾了,会被回收?
public static void swap(Object o1, Object o2)
{
Object temp = o1;
o1 = o2;
o2 = temp;
}o1,o2 只是得到了对象引用的拷贝,交换的只是这两个拷贝