The reason that Program.changeMe(str) does not cause str to be set to "I have changed you!!!" is that although string is a reference type, references are passed by value.
So param is a copy of the reference, it gets changed inside the scope of Program.changeMe(param) and then thrown away at the end of the method.
The reference str is only copied, not changed to reference "I have changed you!!!"