Tecnicamente i casi d'uso potrebbero essere:
1) ma.operazione(mb);
ma viene modificato dalla operazione, mb rimane intatto. Opzionalmente è possibile (spesso è utile nell'ottica del method-chaining o per assegnare/passare ad altro) fare in modo che il metodo restituisca il this, ovvero nell'esempio esattamente il riferimento ma.
Opzionalmente:
mc = ma.operazione(mb); // mc è il riferimento a ma!
2) mc = ma.operazione(mb);
mc è un nuovo oggetto, ma e mb restano intatti.
Tecnicamente è anche possibile offrire un metodo statico es.:
Matrice.operazione(ma, mb);
ma è meno nell'ottica object-oriented e quindi generalmente meno preferibile.