Le variabili sono riferimenti.
Quando li passi ad un metodo vengono passati per valore (copia).

Esempio:
codice:
Object rif1 = new Object();
...
in memoria ho 1 oggetto creato con new Object() e 1 riferimento (variabile rif1)

codice:
passaggio(rif1);
static void passaggio(Object rif2) {
   ...
}
ora ho sempre 1 oggetto ma 2 riferimenti ! rif1 e rif2 che puntano allo stesso oggetto, rif2 è visibile nel metodo che sto eseguendo, rif1 no.

codice:
   rif2 = "Proviamo così";
ora ho creato un altro oggetto, la stringa, a l'ho assegnata a rif2, rif1 non è cambiato!

Quando esco dal metodo rif2 non è più visibile da nessuno, la stringa non ha più riferimenti validi e verrà fatta fuori dal garbage collector, mi rimane solo rif1 che punta sempre a new Object()

per i primitivi (int, long, char ecc..) il discorso è un pò diverso perchè non sono oggetti.