Java 如何创建引用数组
我已经阅读了上面的链接,并且知道如何用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]
这是我的测试:
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]
指向valueb
这不会更改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
”不正确。