Java is always pass-by-value. Unfortunately, when we pass the value of an object, we are passing the reference to it. There is no such thing as “pass-by-reference” in Java. This is confusing to beginners.
The key to understanding this is that something like
Dog myDog;
is not a Dog; it’s actually a pointer
to a Dog.
So when you have
Dog myDog = new Dog("Rover");
foo(myDog);
you’re essentially passing the address of the created Dog
object to the foo
method.