我正在从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 ++逻辑会告诉我,我正在返回对本地创建的数组的引用。我错过了什么?
答案 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。通过引用传递,您可以获得指针效果。