我知道Java通过引用传递对象,所以当一个对象作为参数传递给一个方法时,在方法内部对参数进行的任何操作都是对实际对象完成的。
void main(){
String[] array1 = {"a","b","c"};
someMethod(array1);
print(array1.length);
}
void someMethod(String[] array){
/..code here../
array = null;
}
我希望在尝试打印array1.length时得到一个空指针异常,因为我的方法将其设置为null。然而,这并没有发生。有这个原因吗?
答案 0 :(得分:3)
对象通过参考值(按值传递)传递,而不仅仅是参考。
当您在null
中将someMethod()
设置为数组时,它在技术上将范围someMethod
的数组设置为null
而不是main
中的数组。< / p>
如果您还想null
外部参考,那么只需return null
而不是分配null
。
我建议您阅读此thread以正确理解这一概念。
答案 1 :(得分:2)
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;
}