Java:数组作为引用类型,在方法中

时间:2013-03-03 07:19:38

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

我正在从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 个答案:

答案 0 :(得分:5)

也许这会帮助你理解。

在Java中,这个:

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

意味着完全与此相同:

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

第一种形式中有隐式 new

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

答案 1 :(得分:1)

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

一个局部变量,但是你将它返回给你的main方法并为其赋值变量,所以数组仍然存在。

答案 2 :(得分:1)

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

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

重要的一点是,这里通过值返回引用。不使用它的指针返回数组。总之,你是对的。我实际上对C ++没什么了解

就像电视机有2个遥控器一样。但是如果你改变一个遥控器指向其他电视机,第一个遥控器仍然可以访问旧电视。

答案 3 :(得分:-1)

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