Doesn't C do the same thing? That is, references (& modifier) are just subtle pointers? Or am I wrong, and the calling function will see modifications to the local copy of the pointer? When we went over references in my C class, I just used pointers instead. When the professor asked me why I did that, my answer was "because references are stupid; they just boil down to pointers anyways," which he accepted. Perhaps I was wrong?
In any event, it's important to make a few notes on this topic:
First, calling methods on the object will affect state of the object, if the method changes the state of the object, not the reference to the object. Don't confuse something like String.concat(String) for one of these methods; the statement "String1.concat(String2)" is equivalent to "String1 + String2," and does not affect the state of String1 or String2; it creates a new String object and returns it. Modifying the object (ex: <String> += "hello") will change the reference to the object, and not the state of the original objects. Base types are not objects, and can't be referenced in Java, so this rule doesn't apply to them. Despite this exception, base types still behave according to the same rules that Objects do, if you apply the rules for references to base types' states. Just think about it, they're the same thing: when you pass an object reference, you PUSH and pointer to its location; when you pass a base type you PUSH its value.
Second, it's totally tabu to modify method parameters inside the method! They are not to be considered equals with local variables. The compiler even provides a flag for generating warnings or errors when method parameters are modified, even though it's not the default behavior any more. This whole argument is a corner-case to something Sun would likely consider a hack. This has always been the behavior of Java, but in the beginning it wasn't defined because it wasn't expected to occur.
Third, this discussion is kind of pointless. If your assumptions are faulty, and you encounter this fact of Java, it's immediately obvious to anyone who knows how to use a debugger what's happening.