stevg hat gesagt.:
das ist dein problem
stevg hat gesagt.:
zum ersten: wenn es call-by-value wäre müsstes du "value=new ArrayList();" nicht schreiben
das war nur zum verdeutlichen
stevg hat gesagt.:
zum zweiten: der uebergebene wert wird angefast, nämlich die referenz auf eine ArrayList Instanz.
z.B.:
ArrayList obj = new ArrayList();
test(obj);
jetzt hat obj einen eintrag "hallo"
wie gesagt, das hat mit by-value oder by-reference nichts zu tun, da die reference ueberhaubt nicht angefasst wird
call by reference
When you call a method by reference, the callee sees the caller's original variables passed as parameters, not copies. References to the callee's objects are treated the same way. Thus any changes the callee makes to the caller's variables affect the caller's original variables. Java never uses call by reference. It always uses call by value.
How do you fake call by reference in Java, or more precisely, how can a callee influence the values of it's caller's variables?
* Use a holder/wrapper object passed to the callee as a parameter. The callee can change the object's fields. That object may be as simple an Object[]. In Java a callee may change the fields of a caller's object passed as a parameter, but not the caller's reference to that object. It can't make the caller's variable passed as a parameter point to a different object. It can only make its local copy point to a different object. A holder class is just a class with fields to hold your values. It has no methods other than accessors for the fields.
* Have the callee return the new values, perhaps wrapped in an holder class or Object[], and have the caller store them away somewhere.
* Communicate via a static or instance variable visible to both caller and callee.
* Use a delegate object. The callee calls its methods to save the results for the caller.
Dale King points out that attempts to fake call by reference are usually a sign of poor object-oriented design. A function should not be trying to return more than one thing and that is what the return value is for. He uses the term thing because it is proper to return more than one value (e.g. returning a Point that contains two values). If you are trying to return two values, the test he like to apply is whether you can come up with a logical name for the values as a group. If you can't, you had better look to see if maybe you what you have is really two functions lumped together.