Start here. This is the direct spoken answer to practice first.
Overview
This is a persistent source of confusion because the value being copied for an object variable is itself a reference.
Java is always pass-by-value. A method receives a copy of the value stored in each argument variable. For a primitive, that copied value is the primitive value. For an object variable, the copied value is a reference to the same object. The method can therefore mutate that shared object through its copied reference, but reassigning the parameter to a different object does not change the caller's variable. The phrase pass-by-reference is inaccurate because the method cannot replace the caller's variable itself.