0

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

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

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

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

4

8 回答 8

3

对象通过引用值传递(按值传递)而不仅仅是引用。

当您设置null为 array in 时someMethod(),它从技术上将范围设置someMethodnull不是 in的数组main

如果您也想null外部引用,那么就return null不要分配null.

我建议阅读此线程以正确理解此概念。

于 2012-09-25T21:26:52.997 回答
2

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

于 2012-09-25T21:29:18.153 回答
2

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

于 2012-09-25T21:30:14.307 回答
2

当您someMethod使用参数调用时array1,该方法会传递一个对指向的数组的引用array1。本质上,现在有两个对同一个对象的引用——一个在main范围内,一个在someMethod范围内。如果您更改arraysomeMethod指向 null,这对原始引用没有影响。

于 2012-09-25T21:30:19.677 回答
2

你一定来自 C++ :)

我们所说的“参考”实际上是指参考的价值。当一个对象被传递给一个方法时,它的引用被复制到堆栈中,所以当你设置时array = null,你实际上将堆栈本地设置arraynull,而不是来自调用方法的实际引用。

做你想做的事情:

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 将自动回收您的数组使用的空间。

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

于 2012-09-25T21:31:43.140 回答
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.

}
于 2012-09-25T21:55:56.403 回答
1

您是对的-您在对象中更改的任何内容都将保留,但您不会更改被引用对象中的任何内容,而是引用本身就是一个值。

于 2012-09-25T21:29:25.830 回答
1

尝试:

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

void someMethod(String[] array){
 /..code here../
 array[0] = null;
}
于 2012-09-25T21:30:06.007 回答