# parameterübergabe in java



## tinella (11. August 2005)

was sind die wichtigsten punkte bei diesem thema? ganz allgemein, auch bei main.


danke


----------



## takidoso (11. August 2005)

Meinst Du parameterübergabe innerhalb von Funktionen oder meinst Du Parameterübergabemöglichkeiten von außen an ein Programm?

Ich erzähle mal was zum ersten Fall...
Parameter,  auch Argumente genannt, werden von Java by value übertragen, zumindest gilt dies für die primitiv typen (int, double ...). Das bedeutet der Aufrufer bekommt selbst wenn die Mehtode diesen Parameter einen anderen Wert zu weisen sollte den übergebenen Wert zurück.
Objekte werden "by  reference" übertragen wobei diese Refferenz innerhalb der Methode nicht änderbar sind.  String z.B. ist ein Objekt, wird also eigetnlich per Referenz übertragen aber String hat eine besondere Bedeutung, da der Inhalt eines Strings eigetnlich nicht änderbar ist. Bei Integer und Double etc. sind ebenfalls Objekte aber eigetnlich auch nicht änderbar, da ihnen eine "setWert()" Mehtode fehlt. Du kannst es ja mal ausprobieren eine Methode als Argument eine wie auch immer geartete Number mitzugeben und diese dann versuchen innerhalb der Methode zu ändern. Du wirst außerhalb der mehtode wieder den übergebenen Wert zurück erhalten, genauso sollte es meines Wissens auch mit  String sein.
Wenn man also in Java einzelne Numbers (Double, Integer, BigDecimal ...) als Ausgabeparameter haben will, ohne dafür den Returnwert verwenden zu wollen muss man ein -ich nenne es mal Vehicle - Object verwenden, welches das Zahlenobjekt aufnimmt und man dann innerhalb der aufgerufenen Mehtode wieder mit einem anderen Zahlenobjekt überschreibt. (In den meisten Assembler-Sprachen würde man dazu vermutlich doppelt indirekte Adressierung sagen)
*Kleiner Excurs:*
_Im Gegenstück dazu gibt die Sprache PL1 die  geänderten Werte default-mäßig wieder an den Aufrufer zurück, denn PL1 verwendet normalerweise ein "calling by  reference", es sei denn man klammert das Argument beim Aufruf ein dann bedeutet es "calling by value". 
Bei C und Pascal gibt es defaultmäßig ein "calling by value", möchte man in diesen Sprachen ein  "calling by  reference" so gibt man gewöhnlich einen Pointer mit._

Takidoso


----------



## Thomas Darimont (11. August 2005)

Hallo!



> Objekte werden "by  reference" übertragen


    Ich denke, dass ist so nicht ganz richtig.
    Bei nicht primitiven Typen wird die Referenz per Value übergeben.
  Siehe dazu auch div. Diskussionen unter:
http://groups.google.de/group/de.co...nce&qt_g=1&searchnow=Diese+Gruppe+durchsuchen

    Gruß Tom


----------



## takidoso (12. August 2005)

Hi Tom,
danke für den intersanten Link, obgleich er mir nichts neues in dieser Richtung schildert.
Du hast natürlich recht, die Referenz selbst wird by Value übertragen aber es handelt sich hier um die Referenz also kann das Objekt geänder werden was damit referenziert wird. Würde man also mit der Syntax 
_methodeX(einObject) _ 
das Object als call by Value übertragen würde inerhalb der Methode nur mit einer Kopie gearbeitet werden, Änderungen würde der Aufrufer also nicht mitbekommen
Da hier aber semantisch die Referenz gemeint ist ist es eigetnlich ein calling by referenz obgleich es richtig ist, dass die referenz nicht geändert werden kann, denn die ist wie du richtig sagst als Kope (also by value übertragen worden)
Eigetnlich muss man nur wissen, dass mit einem übergebenen Objekt eine Refeferenz gemeint ist, und keine Pointervariable aber auch keine Kopie des Objekts.
und diese Referenz (Adresse des Objekts) wie alles bei der Übergabe "by vaule" übergeben wird.
In C++ gibt es da soweit ich mich erinnere einen ähnlichen allerdings expliziten Mechanismus und natürlich auch die Möglichkeit die übergebene Adresse des Objekts verändern zu können was dann von der C++Termologie ein Pointer und keine Referenz wäre.
Ich denke wir sind uns da einig.

Takidoso


----------

