Apexにおいては、プリミティブデータ型は値渡し、非プリミティブ型は参照渡しとざっくり覚えてましたが、どうも挙動を見ていると厳密にはJavaと同じく「参照の値渡し(共有渡し)」と呼ばれる動きになってるっぽい。
Example__c e1 = new Example__c(Name = 'hoge');
System.assertEquals('hoge', e1.Name);
fuga(e1);
System.assertEquals('fuga', e1.Name);
void fuga(Example__c e2) {
e2.Name = 'fuga';
e2 = new Example__c(Name = 'fugafuga');
System.assertEquals('fugafuga', e2.Name);
}
e1の値は、fugaで書き換えた'fuga'には書き換わりますが、その後newした時の'fugafuga'には書き換わりません。
よく見ると、開発者ガイドでもそれっぽいこと書いてますね。
https://developer.salesforce.com/docs/atlas.ja-jp.apexcode.meta/apexcode/apex_classes_defining_methods.htm
メソッド内の参照を別のオブジェクトを指し示すように変更することはできませんが、オブジェクトの項目の値は変更できます。