将这个数组作为参数传递给像int[5] &result
一样可以吗?
我想传递对数组的引用,因为我想在调用函数中更改数组。语法是什么?
答案 0 :(得分:34)
private void demo() {
int[] array = new int[5];
System.out.println(Arrays.toString(array)); // 0, 0, 0, 0, 0
fillArray(array);
System.out.println(Arrays.toString(array)); // 0, 1, 2, 3, 4
}
private void fillArray(int[] array) {
for (int i = 0; i < array.length; i++) {
array[i] = i;
}
}
数组是Java中的对象。对象的引用按值传递。
答案 1 :(得分:18)
在Java中,数组按值传递,但该值是对数组的引用。假设您有一个数组arr
。传递它时,您可以更改arr
引用的数组,但不能更改arr
引用的数组;即在方法内部,您可以修改引用的对象,但不能修改仍将是对同一对象的引用的传递变量。我将尝试用一个例子来说明:
public static void swap(StringBuffer a, StringBuffer b)
{
StringBuffer t = a;
a = b;
b = t;
}
public static void change(StringBuffer a, StringBuffer b)
{
a = a.append("1");
b = b.append("2");
}
public static void main(String[] args)
{
StringBuffer a = new StringBuffer("First");
StringBuffer b = new StringBuffer("Second");
swap(a, b);
System.out.println(a + " " + b);
change(a, b);
System.out.println(a + " " + b);
}
输出:
First Second
First1 Second2
您可以从示例中看到,在输出中获取了First Second
而不是Second First
。这是因为在函数swap
中,使用的副本对主要的引用没有影响。这样就说明了你不能修改仍然是对同一个对象的引用的传递变量的事实。但是,函数change
带来了预期的效果,因为可以修改引用的对象。
有关详细参考,请参阅:
Is Java “pass-by-reference”?
答案 2 :(得分:5)
Java是按值传递的。此引用将通过复制的值传递。它仍将指向原始阵列。
int[] arrayToPass
答案 3 :(得分:1)
这可能是一种不受欢迎的思考方式,但我自己来自C / C ++方面,这让我更容易。
在Java中,对象为reference types 。这意味着实际对象在某个堆上,而实际使用的只是该对象的引用。因此,用C指针(作为类比)来思考它更简单。
Classname object;
在C / C ++中的行为类似于以下
Classname *object;
类似地,在函数的情况下,它们的行为就像函数的参数作为指针一样传递。类似于在C
中模拟传递引用的方式void Function(Classname object)
更像下面的C版
void Function(Classname *object)
并且只要您不更改指针本身的值(在java中通过使用新实例重新分配变量),您就可以使用它来访问和修改原始实例。
为了将它全部包装起来,基本类型(int
,double
,boolean
等)以外的所有类型都是引用类型(甚至类似Integer
类型) ,Double
,Boolean
和数组)
正如其他人已经解释的那样,你不需要为它添加&
,就像你期望的那样(除了重新分配新实例之外的某些警告)
答案 4 :(得分:0)
可以更改您的函数参数以接受列表吗?
来自java.util.Arrays的静态方法asList应该返回一个使用该数组作为存储的List。
class Example
{
public static void changeArray( List t )
{
//
}
}
// a caller
int[] test = new int[5];
Example.changeArray( Arrays.asList( test ) ); //list backed with array
我稍后会对此进行审核。