想想看。Java 原语将实际值保存在内存字节区域中:因此,如果a = 4
和b = 3
,则 8 字节机器内存区域可以像(二进制)一样保存它
a = 0 0 0 0 0 0 1 1
b = 0 0 0 0 0 0 1 0
现在,当你说a=b;
意味着
a = 0 0 0 0 0 0 1 0
b = 0 0 0 0 0 0 1 0
然后b++ (i.e. b = b+1)
a = 0 0 0 0 0 0 1 0
b = 0 0 0 0 0 0 1 1
然后
return a;
Then a = 0 0 0 0 0 0 1 0 (i.e. 3)
希望你能理解它的原始价值。尽管对于 java 中的对象,这是完全不同的情况。
现在想想,a 和 b 不是原始的,而是具有 int 字段的对象。Sample 类可能看起来像
class Test {
private int value;
public Test(int value){
this.value = value;
}
public int getValue(){
return value;
}
public int increment(){
value++;
}
}
然后a = new Test(4); and b = new Test(3);
在内存中表示如下:
堆:
a = x63489DF8 ---> [Test(4) Object, value = 4, Heap Memory address = x63489DF8]
b = xDFA78945 ---> [Test(3) Object, value = 3, Heap Memory address = xDFA78945]
(a
并b
持有指向对象的堆内存地址)
现在,当你说a=b;
意味着
a = xDFA78945 ---> [Test(3) Object value = 3, Heap Memory address = xDFA78945]
b = xDFA78945 ---> [Test(3) Object value = 3, Heap Memory address = xDFA78945]
(内存地址中的对象x63489DF8
是可垃圾回收的,a, b
并且指的是同一个对象)
现在,说 b.increment();
然后内存区域中的对象xDFA78945
被操作并且新对象变为[Test(3) Object value = 4, Heap Memory address = xDFA78945]
.
a = xDFA78945 ---> [Test(3) Object value = 4, Heap Memory address = xDFA78945]
b = xDFA78945 ---> [Test(3) Object value = 4, Heap Memory address = xDFA78945]
(请注意,更改反映了两个引用,因为两者实际上都指向同一个对象)
现在返回a.getValue()
返回 4。(即通过引用完成的更改也b
反映在引用a
中)