日期:2014-05-20  浏览次数:20590 次

改变指向---如何在函数中让函数参数指向null
都说Java里面没有“&”,这个若大悲剧就在于,很多时候做事情不方便!
比如,要改变对象中的内容,应该传递整个对象过去!
有人说,这是Java中的引用传递,是类似C中的引用。
姑且不说这种说法对不对【注:我本人相当反对】,
但是,Java中这个所谓的引用十分不好用倒是真的!!!
----------------------分割线-----------------------------------------------

我碰到问题了,正如很多跟我一样在学习Java的同仁们一样,我也掉到沟里了,
这个沟就是那个所谓的“Java引用”

我想做的事:
    将一个类A的对象a作为参数,放入一个函数中,使a不在指向new A(),而是指向null【指向这个词,没办法我还是改不了C的叫法】,于是,我写了这个代码:

public static void main(String[] args) {
class A{

}
class B{
void fun(A a){
a = null ;
System.gc();
}
}
A a = new A();
B b = new B();
b.fun(a);
System.out.println(a);
}

上面的代码结果: test.test$1A@ca0b6 ---[Java真智能,这个输出把我的工程包泄露了]
显然,我失败了!!!
我打算在fun(A a)里面中改变a的指向,使其指向null,结果失败了 ... 

求兄弟们指教下! 


【特别注明: 
      类对象一定要作为函数参数,然后调用函数时指向null,这不是我胡思乱想,而是有实际意义的,我在写连接池时发现,假如有一个List list ,list中有6个数据,只要这6个数据不销毁,就能被外界直接指向,比如:一旦 A a = (A)list.get(0),然后,只要list.get(0)不被销毁,a这东西就存在,然而,我这里又要保存list数据,销毁外部引用,也就是a,纠结死了,所以写了上面这个测试例。 
   哎哟,跑题,扯远了 ...

------解决方案--------------------
1.为什么不把a = null ;放在外面。
2.即使你不放在外面,也没关系,过了main函数,a的生命周期也结束了,java中不需要你手动销毁对象,貌似也没提供api供你销毁单个对象,java有自带的垃圾收集机制。

其实java是简化了程序员的操作(相对c++来说),有C++基础学java还是很轻松的。少数地方转变下观念,大部分地方跟c++还是很类似的。

你的需求描述中,在方法内部改变方法外部变量的引用,java貌似是做不到的。
------解决方案--------------------
你那是什么写法。。main方法里面2个类。。JAVA中参数都是值传递,要实现你的功能可以这样。
public class A {
public static void main(String[] args) {

A[] a = new A[] { new A() };
B b = new B();
b.fun(a);
System.out.println(a[0]);
}
}

class B {
void fun(A[] a) {
a[0] = null;
System.gc();
}
}

------解决方案--------------------
A a=new A();

a只是一个引用,new A()才是对象,当a=null的时候,a已经与new A()没有关系了,但它的类型仍然是A,所以才会输出test.test$1A@ca0b6,但它指向的是null,已经不再指向内存中任何对象