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