请帮我理解一下。如果它们都通过传递引用来工作,那么输出不应该是相同的吗?抱歉,如果这是个愚蠢的问题。
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]);
a=john a=5
b=a b=a
a=mary a=6
印刷b
/T1356-1991商用专用机比较比较
发布于 2014-10-26 23:50:55
首先,“引用传递”是指将参数传递给方法。这不是正确的术语。
非原始变量存储对对象的引用。
设置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”的引用是变量的值。值不是字符串本身,而是对现有string对象的引用(实际上,它是一个内存位置)。
请注意,Java的一个方便的特性可能使这一点在字符串中不那么明显;在Java中,String str = "john";
本质上是用于:
char data[] = {'j', 'o', 'h', 'n'};
String str = new String(data);
这是明确的这里文档。
你可能真的只想看经典的宾基的指针有趣的视频,Java版本。
发布于 2014-10-26 23:53:17
做的时候
String B=A
您正在将引用从A复制到B,因此它们并不指向内存中的相同位置。
当您将"mary“分配给A时,您将变量A的引用更改为内存中的一个新位置。
现在A和B指向内存中不同的位置(或不同的字符串来简化)。
更改数组中的值时,如果不更改数组的引用,则实际上正在更改数组的内容。
https://stackoverflow.com/questions/26579293
复制相似问题