2

我正在从 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++ 中,除非数组是使用运算符动态分配的,否则new调用后数组将不存在,因为它是在方法中本地创建的。据我了解,Java 总是按值传递,而数组是引用类型,所以我的 c++ 逻辑会告诉我,我正在返回对本地创建的数组的引用。我错过了什么?

4

4 回答 4

7

也许这会帮助你理解。

在 Java 中,这是:

int[] tempArray = {1, 2, 3, 4};

意思和这个完全一样:

int[] tempArray = new int[]{1, 2, 3, 4};

第一种形式是隐含 new的。

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

于 2013-03-03T07:30:50.123 回答
1

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

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

于 2013-03-03T07:25:29.430 回答
1

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

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

重要的一点是,这里的引用是按值返回的。不是数组与它的指针一起返回。简而言之,你是对的。我其实对C++知之甚少

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

于 2013-03-03T07:29:33.733 回答
-1

在 Java 中,对象通过引用传递,值通过值传递。数组是对象,它们通过引用传递。通过引用传递,您可以获得指针效果。

于 2013-03-03T08:21:27.590 回答