Java always passes references by value - the reference itself is copied, but both copies point to the same object. This means modifications to the object are visible to the caller, but reassigning the reference is not. The 'pass by value' terminology refers to the reference copy, not the object.