我看过许多关于按值和引用调用的帖子,但几乎找不到引用数据类型的解决方案,如int []或char []。例如:
char b[] = new char[2];
b[0] = 'h';
b[1] = 'i';
char c[] = new char[2];
c = b; // copy by reference?
copy(c,b); // copy by value?
b[0] = 'b';
b[1] = 'y';
System.out.print(b[0]);
System.out.println(b[1]);
System.out.print(c[0]);
System.out.println(c[1]);
public static void copy(char[] dst, char[] src) {
dst[0] = src[0];
dst[1] = src[1];
}
c = b; 更改值,因为c获取b的地址?
副本(c,b); 无法更改值,因为它是按值复制的?但我认为char []是可以改变值的参考数据类型之一。例如,int []是引用数据类型,因此它可以更改如下所示的值:
int[] d = new int[1];
d[0] = 1;
function(d);
System.out.println(d[0]);
public static void function(int[] a) {
a[0] = 4;
}
有人知道吗?
答案 0 :(得分:0)
在Java中:
方法参数确实是按值传递的,但是 Java中的所有对象和数组变量都是引用变量。
Java按值传递所有原始数据类型。这意味着制作了副本,因此无法修改。传递Java对象时,您将传递对象引用,这样就可以修改对象的成员变量。如果要通过引用传递原始数据类型,则需要将其包装在对象中。最简单的方法是将其作为数组传递。您的数组只需要包含一些元素,但将其包装在数组中意味着它可以通过函数进行更改。
答案 1 :(得分:-1)
正如@Tom和@EJP在评论中所指出的,对象的引用是按值传递的。
执行c = b
时,您要设置c
以引用与b
相同的对象。当你对其中任何一个做某事时,它会显示在另一个中。
但是,您的copy
方法会按值引用对象c
和b
。这意味着如果您对任一对象执行某些操作,则该函数返回时会显示该更改。这包括设置数组的元素。但是,当您执行dest[0] = src[0]
时,您正在复制基元char
。没有传递任何引用,如果之后更改了一个数组,则另一个数组不会受到影响。它们仍然是两个独立的阵列,现在碰巧具有相同的内容。