Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何创建引用数组_Java_Arrays_Reference - Fatal编程技术网

Java 如何创建引用数组

Java 如何创建引用数组,java,arrays,reference,Java,Arrays,Reference,我已经阅读了上面的链接,并且知道如何用Java创建引用数组。但它似乎不起作用…… 这是我的测试: Character []c1 = {'a', 'x'}; Character []c2 = new Character[1]; c2[0] = c1[0]; // I try to make c2[0] as the reference of c1[0] c1[0] = 'b'; System.out.println(c1[0]); // b System.out.println(c2[0]

我已经阅读了上面的链接,并且知道如何用Java创建引用数组。但它似乎不起作用……

这是我的测试:

Character []c1 = {'a', 'x'};
Character []c2 = new Character[1];
c2[0] = c1[0]; // I try to make c2[0] as the reference of c1[0]
c1[0] = 'b';

System.out.println(c1[0]);    // b
System.out.println(c2[0]);    // a

是否有任何方法可以使
c2[0]
作为
c1[0]
的引用,以便
c1[0]
中的任何更改都将更新
c2[0]
中的值

Java将所有原始数据类型作为值传递,而不是通过引用传递。但是,对象是通过引用传递的。因此,在本例中,您可以为一个字符创建一个包装器对象,然后创建一个数组。

Java中的“引用”是所有其他语言所称的“指针”。指针只指向对象;Java还具有数字和布尔类型的基本值。当您将
'a'
'x'
分配给
c1
时,您会导致“自动装箱”将分别指向
Character.valueOf('a')
Character.valueOf('x')
的指针插入
c1
的两个插槽中

然后
c2[0]=c1[0]
将指向字符.valueOf('a')的指针放入
c2

请注意,
c2
c1
没有任何关系。对一个数组的更改对另一个数组没有影响。只是现在
c1[0]
c2[0]
都指向包含
'a'
字符

然后
c1[0]=“b”
字符.valueOf('b')
加载到
c1[0]
中。现在
c1[0]
c2[0]
包含不同的指针。更改其中一个中的指针对另一个中的指针没有影响

如果您定义了一个数组变量来指向与
c1
相同的数组,那么您将影响“两个”数组,因为它们实际上只是一个数组

Character[] cX = c1;
c1[0] = 'b'

然后
cX[0]
c1[0]
,实际上每个索引都指向同一个值,因为它们是同一个数组。

在Java中不能这样做,因为Java使用按值传递而不是按引用传递。考虑下面的场景:

Character []c1 = {'a', 'x'};
Character []c2 = new Character[1];

执行这些行后,
c1
数组中的第一个元素指向值
a
c2
数组中的第一个元素指向值
\0
。现在,

c2[0] = c1[0];
c1[0] = 'b';
执行第一行后,
c2[0]
指向与
c1[0]
相同的值(即
a
)。但是,在执行第二行之后,
c1[0]
指向value
b


这不会更改
c2[0]
的值,因为
c2[0]
指向的是
c1[0]
引用的值,而不是实际的
c1[0]
引用。因此,当执行
print
语句时,
c2[0]
仍然指向
a
并打印
a

这有什么意义?执行
c2[0]=c1[0]
操作时,数组将在零索引处包含对同一对象的引用,但这些数组是独立的。Java中没有合法的方法(也许sun.misc.Unsafe
可以做到这一点)对数组的某些部分进行某种依赖引用。

检查下面的两个示例以获得理解

//1st example
Emp emp1 = new Emp("Emp1");
Emp emp2 = new Emp("Emp2");

Emp []c1 = {emp1, emp2};
Emp []c2 = new Emp[1];
c2[0] = c1[0];
c1[0].setName("test");

System.out.println(c1[0].getName()); // Prints test
System.out.println(c2[0].getName()); // Prints test

//2nd example
Character []c1 = {'a', 'x'};
Character []c2 = new Character[2];
c2 = c1; // I try to make c2[0] as the reference of c1[0]
c1[0] = 'b';

System.out.println(c1[0]);    // b
System.out.println(c2[0]);    // b

Java是“按值传递”。然而,所有的“对象”实际上都是引用,所以通过值传递的是引用。一个微妙但极为重要的区别。Java中所有的“引用”实际上都是指针,所以你不会像一些人想象的那样传递引用。@JimGarrison,这就是我在回答中所说的--@JakeGill70,这绝对不是你说的!你字面上说的是,“然而,对象是通过引用传递的”,这是错误的。但这不是错误的,引用只是指向内存中对象的指针,这就是为什么引用不能为空,但指针可以为空,因为指针可以指向任何东西。这对于任何语言都是正确的,因为这是计算机跟踪内存中对象的唯一方法。Java不允许您在内存中传递指向引用的指针(因此总是指向变量/参数所持有的任何对象),因此,对象是Java是通过引用传递的,这可能不是您认为的引用。您提出了一个好问题!说得好,达珊。为了解释我的理解,实例化c1和c2会为这两个字符数组创建单独的内存。因此,每个字符数组在主内存中都有各自的引用和值。您对此有何看法?“
c2
数组中的第一个元素指向值
\0
”不正确。