Java:数组作为引用类型,在方法中 我正在从C++到java,我有一个问题,在java中,数组是如何在它创建的方法之外的。请看下面这个简单的代码: public static int[] arrayMethod(){ int[] tempArray = {1, 2, 3, 4}; return tempArray; } public static void main(String[] args){ int arr[] = arrayMethod(); for(int i : arr){ System.out.println(i); } } C++中,除非数组是用新< /COD>运算符动态分配的,否则调用之后数组将不存在,因为它是在方法中本地创建的。据我理解,java总是通过值,数组是引用类型,所以C++逻辑会告诉我,返回一个本地创建的数组的引用。我遗漏了什么?

Java:数组作为引用类型,在方法中 我正在从C++到java,我有一个问题,在java中,数组是如何在它创建的方法之外的。请看下面这个简单的代码: public static int[] arrayMethod(){ int[] tempArray = {1, 2, 3, 4}; return tempArray; } public static void main(String[] args){ int arr[] = arrayMethod(); for(int i : arr){ System.out.println(i); } } C++中,除非数组是用新< /COD>运算符动态分配的,否则调用之后数组将不存在,因为它是在方法中本地创建的。据我理解,java总是通过值,数组是引用类型,所以C++逻辑会告诉我,返回一个本地创建的数组的引用。我遗漏了什么?,java,pass-by-value,local-variables,Java,Pass By Value,Local Variables,因为您返回了对数组的引用,然后将其分配给int arr[],所以数组仍然有指向它的东西。所以垃圾收集器不会剔除它,因为它仍然有一个引用 它是一个局部变量,但随后您将其返回到main方法并为其分配了一个变量,因此数组仍然存在。对数组的引用是按值传递的。所以你有两个参考资料。将按值返回对数组的引用。所以只要引用指向数组,就可以对数组进行更改(应用一些操作) 现在,如果有两个引用指向同一个数组,则通过任一引用更改数组将更改同一数组。但是,如果在某个点更改引用的值(即更改引用点指向的数组),那么这两个引

因为您返回了对数组的引用,然后将其分配给int arr[],所以数组仍然有指向它的东西。所以垃圾收集器不会剔除它,因为它仍然有一个引用


它是一个局部变量,但随后您将其返回到main方法并为其分配了一个变量,因此数组仍然存在。

对数组的引用是按值传递的。所以你有两个参考资料。将按值返回对数组的引用。所以只要引用指向数组,就可以对数组进行更改(应用一些操作)

现在,如果有两个引用指向同一个数组,则通过任一引用更改数组将更改同一数组。但是,如果在某个点更改引用的值(即更改引用点指向的数组),那么这两个引用将指向不同的数组

重要的一点是,这里引用是通过值返回的。Not数组与其指针一起返回。简言之,你是对的。实际上我对C语言的理解很少++


就像一台电视机有两个遥控器。但是,如果您将一个遥控器改为指向其他电视机,第一个遥控器仍然可以访问旧电视机。

也许这会帮助您理解

在Java中,这是:

int[] tempArray = {1, 2, 3, 4};
意思与此完全相同:

int[] tempArray = new int[]{1, 2, 3, 4};
第一种形式中有一个隐式的
new


在Java中,所有数组都是堆对象/引用。当一个数组被传递给一个方法时,它的处理方式与任何引用的处理方式相同;i、 e.引用按值传递。(不,这不是“通过引用调用”或“通过引用传递”,因为这些术语都被正确理解。)

在Java中,值是通过值传递的。通过引用传递,您可以获得指针效果。

Ah!谢谢我已经知道Java是严格按值传递的,我不知道数组是堆对象。Java中的所有对象都存储在堆中吗?@naxchange-所有Java对象类型都是引用类型,引用类型的所有实例都存储在堆中。@naxchange:Java中的所有对象都是动态分配并存储在堆中的。您之所以知道这一点,是因为Java中没有“对象类型”,所以不能有一个值“是”对象的变量。所有对象都必须通过指向它们的引用进行操作。@StephenC:“所有Java对象类型都是引用类型”,这毫无意义。Java没有“对象类型”。引用类型的值是引用,它们是指向对象的指针。这是不正确的:Java中没有“通过引用传递”这样的东西。对象引用按值传递,其值为对象引用(又称内存地址)