Como te han dicho, todo en Java se pasa por valor. Intentaré explicarlo de una forma for dummies
Supongamos que tienes un objeto de tipo Leon:
Leon leon = new Leon("Simba");
¿Qué pasa internamente? Bien, la nueva instancia de León se almacena en una dirección de memoria, supongamos que en la dirección 57. Ahora, le pasamos el objeto leon al método editLeon:
public void editLeon(Leon leon) {
leon.setName("Oscar");
leon = new Leon("Mustafa");
}
¿Qué está pasando internamente?
Lo que está pasando es que el método editLeon recibe
un puntero apuntando a la dirección de memoria del objeto pasado. Entonces, por medio de este puntero podemos acceder al objeto y cambiar sus propiedades. En la siguiente línea, se crea una nueva instancia en la posición 125 por ejemplo, y el puntero cambia de dirección y ahora apunta a la dirección (125) de la nueva instancia. Java funciona igual que C en este aspecto.
Espero se haya entendido.