in Java esistono _solo_ le chiamate per riferimento per quanto riguarda gli oggetti.
In realta' credo che la situazione sia meglio descritta dicendo che tutte le variabili sono reference (puntatori) e vengono passate per valore (Il valore del puntatore) lasciando da parte ovviamente i tipi primitivi...
Se infatti e' vero che posso modificare i campi dell'oggetto passato come parametro, non posso pero' cambiare l'oggetto puntato, nel senso che quando il metodo ritorna, il parametro effettivo puntera' ancora allo stesso oggetto.

Questa "limitazione" si risolve ripensando e riprogettando meglio la propria applicazione.
Ogni volta che si incoccia in essa, infatti, e' indice che si sta cercando di rompere l'incapsulamento.