如何删除传递给Java方法的对象?

时间:2012-09-25 21:25:32

标签: java pointers methods reference

我知道Java通过引用传递对象,所以当一个对象作为参数传递给一个方法时,在方法内部对参数进行的任何操作都是对实际对象完成的。

void main(){
 String[] array1 = {"a","b","c"};
 someMethod(array1);
 print(array1.length);
}

void someMethod(String[] array){
 /..code here../
 array = null;
}

我希望在尝试打印array1.length时得到一个空指针异常,因为我的方法将其设置为null。然而,这并没有发生。有这个原因吗?

8 个答案:

答案 0 :(得分:3)

对象通过参考值(按值传递)传递,而不仅仅是参考。

当您在null中将someMethod()设置为数组时,它在技术上将范围someMethod的数组设置为null而不是main中的数组。< / p>

如果您还想null外部参考,那么只需return null而不是分配null

我建议您阅读此thread以正确理解这一概念。

答案 1 :(得分:2)

someMethod中的

array只是指向该对象的另一个指针。因此,当您设置array = null;时,您只需将指针设置为null。该对象仍然存在于堆上,并且仍由main()中的array1指向。

答案 2 :(得分:2)

数组引用按值传递。因此,您的方法获取对数组的引用的副本。使用此引用,您可以更改数组的内容,但如果您更改引用本身 - 即您尝试将参数设置为null或新数组 - 更改将不会< / em>反映在方法之外。

答案 3 :(得分:2)

当您使用参数someMethod调用array1时,该方法将传递对array1指向的数组的引用。基本上,现在有两个对同一对象的引用 - 一个在main范围内,一个在someMethod范围内。如果您将array中的someMethod更改为指向null,则这对原始参考没有任何影响。

答案 4 :(得分:2)

你必须来自C ++:)

参考&#34;参考&#34;我们实际上是指参考的。将对象传递给方法时,其引用将复制到堆栈,因此当您设置array = null时,您实际上将堆栈本地array设置为null,不是调用方法的实际引用。

做你想做的事情:

void main(){
    String[] array1 = new String[] {"a","b","c"};
    array1 = someMethod(array1);
    print(array1.length); // NullPointerException thrown here
}

String[] someMethod(String[] array){
    /..code here../
    return null;
}

当Java开始耗尽空间并运行其垃圾收集器时,它将自动回收数组所使用的空间。

将其视为类似于传递指针的副本而不是指针本身。操作复制的指针不会像您在示例中观察到的那样更改原始指针。

答案 5 :(得分:2)

Java传递引用值,因此该值指向引用。一旦我们更改了对象,该对象就会被更改。但是如果你在方法中重新初始化它,那么真正的对象将不会被改变; 这是一个例子:

void main(){
    String[] array1 = new String[] {"a","b","c"};
    someMethod(array1);
    print(array1[0]); //you will see q
}

void someMethod(String[] array){
    array[0] = "q"; //i am NOT overriding it, I am changing the existing object

}

这是我将重新初始化它

void main(){
    String[] array1 = new String[] {"a","b","c"};
    someMethod(array1);
    print(array1.length); //you will see 3
}

void someMethod(String[] array){
    array = null; //I am totally overriding the object, so it will not affect to the object inside main method.

}

答案 6 :(得分:1)

你是对的 - 你在对象中改变的任何东西都会保留,但是你没有改变引用对象中的任何东西,而是引用它本身就是一个值。

答案 7 :(得分:1)

尝试:

void main(){
 String[] array1 = {"a","b","c"};
 someMethod(array1);
 print(array1[0].length());
}

void someMethod(String[] array){
 /..code here../
 array[0] = null;
}