A copy of the reference str is passed to the method changeIt, both the copy and origonal refence , reference the object created by new String ("1"), in change it the copy of the reference is made to reference a different string object "2", On exit from changeit the copy of the refence to "2" is gone, and all you have is the origonal reference still "1".
In the second call incr (iArr) you again create a copy of the reference in this case iArr BUT you use the refence to alter the referant, as both the origonal reference and the copy refer to the same array , even after the copy of the refernce is gone on return from incr the change is visible.
This might help (change your changeIt method to this)
The results are ...
true false 2 1
"Eagles may soar but weasels don't get sucked into jet engines" SCJP 1.6, SCWCD 1.4, SCJD 1.5,SCBCD 5