My question in the end comes down to this. Why is Java Call By Value and C++ Call By Reference (when using pointers) ?
C++ is really call-by-value, not call-by-reference. The by-reference behavior you see in C++ is a side effect of the fact that you're passing a pointer: the pointer itself is copied by value. You can't compare these situations because Java doesn't have pointers.