【问题标题】:Java: arrays as reference types, in methodsJava:数组作为引用类型,在方法中
【发布时间】:2013-02-17 11:14:42
【问题描述】:

我正在从 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++ 逻辑会告诉我,我正在返回对本地创建的数组的引用。我错过了什么?

【问题讨论】:

    标签: java pass-by-value local-variables


    【解决方案1】:

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

    一个局部变量,但是你把它返回到你的 main 方法并分配给它一个变量,所以数组仍然存在。

    【讨论】:

      【解决方案2】:

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

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

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

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

      【讨论】:

        【解决方案3】:

        也许这会帮助你理解。

        在 Java 中,这是:

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

        表示完全与此相同:

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

        第一种形式中有一个隐式new

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

        【讨论】:

        • 啊!谢谢。我已经明白 Java 是严格按值传递的,我不知道数组是堆对象。 Java中的所有对象都存储在堆中吗?
        • @naxchange - 所有 Java 对象类型都是引用类型,所有引用类型的实例都存储在堆中。
        • @naxchange:Java 中的所有对象都是动态分配并存储在堆中的。您知道这一点是因为 Java 中没有“对象类型”,因此您不能拥有一个其值“是”对象的变量。所有对象都必须通过指向它们的引用进行操作。
        • @StephenC:“所有 Java 对象类型都是引用类型”这没有意义。 Java 没有“对象类型”。引用类型的值是引用,是指向对象的指针。
        【解决方案4】:

        在 Java 中,objects are passed by reference 和值是按值传递的。 Arrays are objects and they are passed by reference。通过引用传递,您将获得指针效果。

        【讨论】:

        • 这是不正确的:Java 中没有“通过引用传递”之类的东西。对象引用是按值传递的,它们的值是一个对象引用(也就是内存地址)
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-11-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多