Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
这个传递给方法的Java数组是怎么回事?_Java_Arrays - Fatal编程技术网

这个传递给方法的Java数组是怎么回事?

这个传递给方法的Java数组是怎么回事?,java,arrays,Java,Arrays,我了解到在Java中,数组是通过引用传递的,这意味着它们可以在函数中修改。然而,我最近遇到了这段让我困惑的代码,因为它似乎显示了不一致的行为 import java.io.*; 导入java.util.*; 公共类测试程序{ 公共静态无效法(int[]f){ f[0]=9; f[1]=7; f=新整数[4]; } 公共静态void main(字符串[]args){ int[]fParam=新的int[3]; F方法(fParam); System.out.println(Arrays.toStr

我了解到在Java中,数组是通过引用传递的,这意味着它们可以在函数中修改。然而,我最近遇到了这段让我困惑的代码,因为它似乎显示了不一致的行为

import java.io.*;
导入java.util.*;
公共类测试程序{
公共静态无效法(int[]f){
f[0]=9;
f[1]=7;
f=新整数[4];
}
公共静态void main(字符串[]args){
int[]fParam=新的int[3];
F方法(fParam);
System.out.println(Arrays.toString(fParam));//prints[9,7,0]
}
}

由于函数
fMethod()
似乎在最后将f重置为
新的int[4]
,因此我希望看到
[0,0,0]
打印到控制台。然而,似乎只有
f[0]=9
f[1]=7
行被实际执行,而最后一行被忽略。我觉得这很奇怪。有人能给我指出正确的方向吗?

在fMethod中,数组作为变量f传递。只要修改变量的内容,它实际上就会更改引用。 在方法的第3行:
f=newint[4]
为变量f分配一个新数组。这意味着您可以通过指定一个新值来覆盖变量f所持有的引用,因此之后对数组的任何修改都会发生在新指定的数组上。 如果您将引入一个类变量并将其传递给该方法,那么您的应用程序将按照您的预期运行。

记住:

在Java中,所有内容都通过值传递

对于对象(数组也是对象),对象的地址(一个值)被复制到另一个变量中

在您的代码中,
int[]f
是一个局部变量(作用域在方法中),它最初引用原始数组,并且:

f[0]=9;
f[1]=7;
更改原始数组

但是,然后您将一个
新的
数组对象分配给
f
,最终您将完全放弃该对象(因为您不返回任何内容)

只要
f
引用第一个数组,它就会改变该数组,因此,它只改变它的前两个元素。在那之后,
f
指的是其他东西


但是,在您的
main
方法中,
fParam
仍然引用上一个数组对象,并且您打印该对象,其中第三个元素是整数数组的默认值0。

是否回答了您的问题?为了扩展,Java只是按值传递。数组是对象,您可以根据对象的引用修改对象。但是,修改传递到方法中的引用不会影响外部的任何内容。@AndrewVershinin那么说编译器将忽略函数范围中引用的任何直接“重新指向”是否正确?它不会被忽略。您正在创建一个名为
f
的新的局部范围变量,并隐藏输入参数。同时,
main
方法仍然维护对传递到方法中的
fParam
数组的引用。您的语句“数组通过引用传递”:不,这是不正确的。Java只支持“按值传递”,甚至引用也是按值传递的。如果将引用作为参数传递给方法,则该方法将收到该引用的副本。尝试更改该引用的副本以指向其他内容只会更改该方法范围内的副本,而不会更改传入的原始引用