John360 sei stato molto chiaro, grazie!
Dunque, se ho capito bene, all'interno del metodo "annulla" si crea una copia della variabile che rappresenta l'indirizzo dell'oggetto che ho passato per riferimento. Se tramite questa copia modifico gli attributi dell'oggetto (per esempio quando faccio dall'interno del metodo "a.val = 0;") questi vengono modificati perchè essa punta all'oggetto passato per riferimento. Ma se modifico la variabile in sè, (quando faccio a=null sto agendo sulla copia e quindi quella modifica ha valore solo per la copia e non per la variabile esterna che contiene ancora l'indirizzo corretto dell'oggetto.

Dimmi se sbaglio, ma in questo senso capisco anche le molte discussioni a proposito del passaggio per valore o per riferimento degli oggetti in JAVA. Di fatto JAVA crea una copia dell'indirizzo dell'oggetto e usa quella all'interno del metodo (e dunque si potrebbe parlare di passaggio per valore), però essendo quella copia di fatto un puntatore si parla giustamente di passaggio per riferimento, tranne per l'eccezione del caso che ho sopra riportato che evidenzia questo meccanismo.
Dico bene?

Grazie ancora e buona serata!