java - 字符串和数组引用

时间:2014-10-26 23:44:40

标签: java pass-by-reference

请帮我理解这一点。如果它们都通过传递引用来输出,那么输出是否应该相同?对不起,如果这是一个愚蠢的问题。

String A="john";
String B=A;
A="mary";
System.out.println(B);

int[] a=new int[]{5};
int[] b=a;
a[0]=6;
System.out.println(b[0]);

α=约翰= 5
B = A B = A
一个=玛丽= 6
print b print b
 --------- ---------
约翰6

2 个答案:

答案 0 :(得分:2)

执行时

String B=A

您正在将参考从A复制到B,因此它们不会指向内存中的相同位置 将“mary”指定给A时,您将var A的引用更改为内存中的新位置 现在A和B指向内存中的不同位置(或者不同的字符串以简化)。

更改数组中的值时,不会更改数组的引用,实际上是在更改数组的内容。

答案 1 :(得分:1)

首先,“通过引用传递”是指将参数传递给方法。这不是正确的术语。

非原始变量存储对象的引用。

当你设置A="john"时,你创建一个字符串,“john”,变量A引用它。

当您设置B=A时,您设置B以引用A在该时间点也引用的同一对象。

当您设置A="mary"时,您创建一个新字符串“mary”,变量A现在引用 。但是这对那个仍然存在的“john”字符串没有影响,B引用它。

这与基元完全相同:

int x = 10;
int y = x;  // y now holds the value, 10
x = 11;     // x now holds the value, 11, but y is still 10.

对字符串“john”或“mary”的引用是变量的值。该值不是字符串本身,它是对现有字符串对象的引用(实际上它是一个内存位置)。

请注意,Java的一个方便功能可能会使字符串不那么明显;在Java中String str = "john";本质上是一个快捷方式:

 char data[] = {'j', 'o', 'h', 'n'};
 String str = new String(data);

这清楚地记录了here

你真的可能只想看经典的Binky's Pointer Fun video, Java version