J'arrive un peu tard ;), mais bon, ça peut toujours aider...
Voici ce que j'ai compris:
Les types primitifs (int, float, etc.: qui commencent par une minuscule) sont passés par valeur.
Les types complexes (tous les autres, tous les objets) sont passés par référence MAIS certains d'entre eux sont IMMUTABLES (tous les wrappers: Integer, Float, etc. + String + ?), autrement dit, lorsqu'ils sont modifiés, une nouvelle zone mémoire est créée...
Conséquence: lorsque l'on passe un type immutable comme paramètre à une méthode, on passe la référence, mais dès la 1ère modification, une autre zone est créée, donc dans la méthode appelante, le paramètre n'est pas mis à jour!
Solution: créer une classe qui encapsule le type primitif ou le wrapper.
C'est clair?