Kommt aus Sprachen ohne einen GC (C/C++/Rust ..) Ich frage mich, was genau passiert, wenn ein Array neu zugeordnet wird.Was ist ein Referenzwert in Java und warum ändert er sich?
wenn wir in einer c sind ++ wie Sprache (Pseudo-Code), wird dies als schlecht:
Obj *x = xarr[2];
xarr.push(new Obj(12));
do_with(x);
Beispiel in c läuft ++ http://ideone.com/qk7vcj
nach dem Stoß kann x aufgrund freigegebenen Speicher zeigen Umverteilung von Xarr.
x ist im Grunde genommen nur eine Zeigergröße, die die Speicheradresse von xarr [2] speichert.
wenn ich das gleiche in Java mache. Das funktioniert gut und ich frage mich warum?
was genau ist x und wie und warum wird die Speicheradresse von x geändert, nachdem das Array scheinbar neu zugeordnet wurde?
offensichtlich java ist nicht deepcopying das Array, weil x2 konnte nicht ändern X wie in diesem Code, wie Sie sehen können, ändert sich auch die Adresse von x.
private static class OBJ {
int one;
String two;
public OBJ() {
this.one = 1;
this.two = "two";
}
}
public static void do_it(OBJ o) {
System.out.println("o.two is: " + o.two);
}
public static void main(String[] args)
{
List<OBJ> list = new ArrayList<>();
list.add(new OBJ());
list.add(new OBJ());
list.add(new OBJ());
OBJ x = list.get(2);
printAddresses("Address x", x);
for (int idx = 0; idx < 1000000; idx++) {
list.add(new OBJ());
}
OBJ x2 = list.get(2);
x2.two = "haha";
printAddresses("Address x", x);
do_it(x);
}
soll nicht dieses
Address x: 0x525554440
Address x: 0x550882b80
o.two is: haha
voll funktionierendes Beispiel gefunden werden kann http://ideone.com/P3j6xF
hier ausdrucken, so dass wirft die Frage auf, wie die Adresse von x nach der Neuverteilung der Liste geändert. Und was genau ist die sogenannte "Referenz"? Ich dachte, die so genannte "Referenz" in Java ist nur ein gewöhnlicher Zeiger mit etwas wie Autodeferenzierung und keine Zeigerarithmetik, weil in Java alles nach Wert und nicht nach Referenz weitergegeben wird. dies ist in diesem Code http://ideone.com/k4Ijq0
public static void test1(OBJ o) {
o.one = 2;
}
public static void test2(OBJ o) {
o = new OBJ();
o.two = "no reference";
}
public static void main (String[] args) throws java.lang.Exception
{
OBJ x = new OBJ();
test1(x);
test2(x);
System.out.println("x.one: " + x.one + " x.two: " + x.two);
}
Ausdrucken
x.one: 2 x.two: two
so scheint es klar ersichtlich, wie x ist wie ein Zeiger verhalten, aber irgendwie Java ist es bei Bedarf umgeleitet wird. Wie funktioniert das? Der Begriff "Referenz" ist besonders verwirrend, warum heißt es so?
Auch, [Was ist der Unterschied zwischen einer Variablen, Objekt und Referenz?] (Http://stackoverflow.com/questions/32010172/what-is-the-difference-between-a-variable-object-and -Referenz) –
@ Sotirios Delimanolis dies ist nicht wirklich mein Problem anzugehen. –
Bitte klären Sie dann. Was meinst du mit _bend diese Referenz_? –