Bin jetzt zwar kein Java Experte,
aber ich glaube zu wissen, es macht das Selbe:
Wenn du ein Objekt von einem Datentyp erstellst, existiert es irgendwo in deinem Speicher. Übergibst du beim Funktionsaufruf das Objekt als Parameter wird bei c/c++
der Kopier-Konstruktor aufgerufen und dein Objekt liegt nun zweimal vor.
Benutzt du nun in der aufgerufenen Funktion das übergebene Objekt wird nur die Kopie davon geändert.
Übergibst du allerdings den Zeiger bzw. die Referenz, arbeitet deine Unterfunktion mit dem "Einen" Objekt weiter.
Falls was fehlerhaft beschrieben wurde, bitte ich um Verbesserung