2016-05-06 6 views
0

Es ist ein Code:Klasse Daten Mitglied ändert sich nicht nach der Abtretung

class A { 
    int x = 12; 
} 
public class Program { 
    public static void main(String [] args) { 
     A a = new A(); 
     int d = 10; 
     a.x = d; 

     System.out.println("a.x: " + a.x + ", d: " + d); 

     d = 52; 
     System.out.println("a.x: " + a.x + ", d: " + d); 
    } 
} 

Die Ausgabe lautet:

a.x: 10, d: 10 
a.x: 10, d: 52 

Warum a.x ändert sich nicht? Wie ich während der Zuweisung verstehe, wird der linke Wert als Referenz für den richtigen Wert genommen, und wenn der rechte Wert danach geändert wird, muss sich auch der linke Wert ändern. Warum passiert das nicht?

+1

"Wie ich während der Zuweisung verstehe, nimmt der linke Wert eine Referenz des richtigen Wertes, und wenn der rechte Wert danach geändert wird, muss sich auch der linke Wert ändern." Was bringt dich dazu, das zu denken? Der Zuweisungsoperator kopiert einfach den Wert von der rechten Hand des Bedieners in die Variable auf der linken Seite (mit beliebigen Umrechnungen wie benötigt). –

+0

Ich lese so etwas in 'Thinking in Java' – luckystrrrike

Antwort

2

Dies ist, weil Sie Primitive verwenden. Werte werden kopiert, keine Referenzen.

Wenn Sie Objekte verwenden würden, hätten sie die gleiche Referenz und das Ergebnis, das Sie erwartet haben.

1
int d = 10; 
a.x = d; 

Was Sie hier haben, kopiert man d im Speicher zu platzieren, wo a.x ist (Anmerkung: Sie mit Primitiven nicht mit Objekten zu tun haben, also keine Hinweise, wie mit Objekten). So haben Sie 10 an zwei Stellen, für d und für a.x. Als nächstes ändern Sie den Wert d = 52; Sie haben für d geändert, aber a.x hat einen eigenen Wert, der 10 ist.

gleiche passiert, wenn Sie haben:

A a2 = new A(); 

und Sie tun so etwas wie:

a2.x = a.x; 
a.x = 50; 

a2.x 10 sein wird, weil sein anderes Objekt mit seiner eigenen primitiven x, und Sie Wert kopiert es und ändern eines von ihnen ändert es einfach, nicht das andere. Aber wenn Sie dies tun:

A a2 = new A(); 
a = a2; 
a.x = 52; 

Dann a2.x52 sein wird, da Sie anhand von a geändert Objekt zu zeigen, welche mit a2 verwiesen wird (Objekt, das bis dahin frei, hängen so GC mit einem verwiesen wurde wird gelöscht, wenn es sich entscheidet), so jetzt a2.x und a.x sind die gleichen primitiven.

+0

Sie meinen, Primitive sind nach Wert, nicht die Referenz übergeben? – luckystrrrike

+0

@luckystrrrike Primitive haben keine Referenz und Java ist _always_ call by value. – Tom

2

bitte neu ordnen Sie die Variable a.xd verwenden, da x ist ein int und Objekt Mitglied der Klasse A. Also, Zuweisung des Wertes stattfindet, anstatt Referenz.

Vielen Dank.

0

Sie haben a.x nie einem neuen Wert zugewiesen.

Die Instanz A a = new A(); immer noch den alten d Wert, weil es im Grunde ist es in dem Speicher diesen Zeitpunkt kopiert.

Später haben Sie d einen neuen Wert zugewiesen, der keine Auswirkung auf Instanz a hat, da Grundelemente keine Referenzen sind. Sie sind nicht miteinander verbunden.