call by reference
-
hallo da ich eig aus der c++ ecke komme aber im rahmen des studiums jetz java lerne hab ich noch einige fragen
aus spass möchte ich ein kleines konsolenspiel schreiben...
ich habe jetz eine klasse spieler , ein spieler hat hp und soll nun einen anderen spieler angreifen können und dessen hp ändern können
wie geht das in java
void attack(spieler anderer) ?
oder is das nur ein aufruf call by value wo dann eine kopie des anderen verändert wird?
also in c++
void attck(spieler& anderer)
-
Du hast in Java generell nur Referenzen, wenn du Objekte übergibts.. nur bei Standarttypen eben nicht, da wird ne ordentliche Kopie angelegt.
MFG
-
also bei primitiven datentypen wie int und so oder bei Strings werden also Kopien angelegt, sonst nicht?
und wenn ich jetz 2 int zB vertaushcen will?
void tausche(int& a,int& b)
?
-
Dann kriegt man als C++/C#'ler ne Krise und muss einen Wrapper drum bauen.
-
gasst schrieb:
also bei primitiven datentypen wie int und so
ja
oder bei Strings
nein, string ist ein object
werden also Kopien angelegt, sonst nicht?
ja
Das ganze ist aber trotzdem kein Call by Reference, sondern nur ein Call by Value, mit der Value des Pointers(aka. Referenz in Java). Dann kannst du das Objekt auf das dein Pointer zeigt änderen, aber nicht dne Pointer selber.
Bei String musst du dann auch noch beachten, dass er Immutable ist
http://www.programmersheaven.com/2/FAQ-JAVA-String-Is-Immutablepublic static void main(String[] args) { StringBuffer buf1 = new StringBuffer(); foo(buf1); System.out.println("buf1: " + buf1.toString()); String string = new String(); string+="a "; bar(string); System.out.println("string: " + string); StringBuffer buf2 = null; boom(buf2); try { System.out.println("buf2: " + buf2.toString()); } catch(NullPointerException e) { System.out.println("BOOM"); } } private static void foo(StringBuffer s) { s.append("test"); } private static void bar(String s) { s+="test"; } private static void boom(StringBuffer s) { s = new StringBuffer(); s.append("test"); }
-
gasst schrieb:
und wenn ich jetz 2 int zB vertaushcen will?
void tausche(int& a,int& b)
?
Geht in dem Sinne nicht da du in Java keine Referenzen auf primitive Datentypen übergeben kannst.
Wenn du umbedingt willst kannst du dir eine Klasse dafür schreiben. So nach dieser Idee:
public class IntPair { public int a, b; public IntPair(int a, int b) { this.a = a; this.b = b; } public void tausche() { int tmp = a; a = b; b = tmp; } // andere Methoden.. }
Und dann so verwenden:
IntPair p = new IntPair(1, 5); // mit p.a und p.b arbeiten p.tausche(); // mit vertauschtem p.a und p.b arbeiten
Allerdings muss ich sagen das mich das noch nie an Java gestört hat das von primitiven Typen eine Kopie erstellt wird. Wenn man von C/C++ kommt muss man sich vielleicht erstmal etwas dran gewöhnen.
mfg xorm :xmas2:
-
in der hinsicht unterscheiden sich primitive nicht von objekten. java kennt kein call by reference. aus java sicht geht sowas
void swap( int a, int b );
ebenso wenig wie
void swap( Object a, Object b );
alles, was man an fuktionsparamtern manipulieren kann, ist ihr zustand, aber nicht ihre identität.