您创建了一个Sample ojbect,并在 f 函数之外使 myOtherSample 指向它 . 通过调用 f(myOtherSample,i) , myOtherSample 值(其值为地址的指针)将传递给 s ,该 s 在 f 函数范围内定义 . 所以现在指针 s 指向Sample对象,在这里你可以使用指针 s 更改该Sample对象的 j 值 .
但在此之后,指针 s 被重新分配给在 f 函数( s=s2 )内创建的新Sample对象,如果对指针 s 指向的对象进行任何更改,则 myOtherSample 指向的Sample对象将不会更改 . 现在 .
2 回答
它实际上并没有以你正在思考的方式通过引用传递 . 最好理解引用变量(mySample,myOtherSample,s和s2)实际上只是保存对象在内存中的位置 . 因此,s是与myOtherSample完全独立的变量 . 它只是指向内存中的同一个对象,因为myOtherSample是f的参数 . 当您将s =设置为s2时,s不再指向与myOtherSample相同的对象 . 但是,myOtherSample不受影响,因为它是一个完全独立的变量 . 这个概念有时可能很棘手,或许可以查看绘制框箭头图,因为这可以提供帮助 .
Java始终按值传递:Is Java "pass-by-reference" or "pass-by-value"?
您创建了一个Sample ojbect,并在
f
函数之外使myOtherSample
指向它 . 通过调用f(myOtherSample,i)
,myOtherSample
值(其值为地址的指针)将传递给s
,该s
在f
函数范围内定义 . 所以现在指针s
指向Sample对象,在这里你可以使用指针s
更改该Sample对象的j
值 .但在此之后,指针
s
被重新分配给在f
函数(s=s2
)内创建的新Sample对象,如果对指针s
指向的对象进行任何更改,则myOtherSample
指向的Sample对象将不会更改 . 现在 .这就是你的代码中发生的事情 . 您应该了解有关Java隐式
pointer
的更多信息 .