2016-04-19 13 views
1

Vor diesem Hintergrund:Ich bin verwirrt über die Grundlagen der Zeiger/Referenzen

int a = 10; 
int b = a; 
a++; 

Ist b = 10 oder 11? wenn 10, warum dann geschieht dies (ich bin mit Android als Beispiel):

TextView x = new TextView(); 
TextView y = x; 
x.setText("abcde"); 

, die y Text Wesen führt auch auf „ABCDE“, nicht wahr?

EDIT:

Was passiert, wenn ich 'Integer' anstelle von 'int'? Will b = 11?

+3

Es gibt keine Zeiger in 'Java'! – Abubakkar

+0

Lol. Was ist der Unterschied? es und Referenz (Entschuldigung für meine Ignoranz: D)? –

+0

Ein guter Weg, um zu sehen, was passiert, ist über den Code debuggen und sehen, was passiert. – Andro

Antwort

2

Ein int ist ein Primitiv, also a und b beziehen sich nicht auf ein Objekt, sie halten nur einen Wert. Daher kopiert die Zuweisung int b = a; den ursprünglichen Wert a zu b und a++ nur ändert a.

Bei Referenztypen unterscheidet sich das Verhalten, wie in Ihrem TextView Code-Schnipsel gezeigt. x und y beziehen sich auf die gleiche TextView Instanz (Objekt), so ändert x.setText("abcde") die einzelne Instanz, auf die beide verweisen.

+0

Nicht wirklich. Im zweiten Beispiel kopiert er auch nur den ursprünglichen Wert von "x" nach "y". Der Wert ist jedoch der Verweis auf das Objekt 'TextView' und somit auf dasselbe Objekt. ;-) – Vampire

0

Nun, a++ die Kurzform von a = a + 1, so dass Sie einen neuen Wert zu a zuzuordnen, ist das Ergebnis der 1-a hinzufügen. Aber im zweiten Beispiel rufen Sie eine Methode für das Objekt auf, auf das sowohl x als auch y verweisen, so dass Sie das Objekt ändern.

2

Sie müssen zu den Grundlagen zurückkehren.

Die Dinge funktionieren anders für Primitive und Objekte in Java.

Zum Beispiel sind für den folgenden Code a und b verschiedene Variablen und haben ihre individuellen Werte.

int a = 10; 
int b = a; 
a++; 

Also, wenn Sie a++ tun es wirkt sich nur Wert für a und nicht b weil sie Primitiven und sie verfügen über separate Einzelwerte.

Aber für diesen Code

TextView x = new TextView(); 
TextView y = x; 
x.setText("abcde"); 

Beide x und y sind verschiedene Variablen, aber sie beide im Speicher auf das gleiche Objekt beziehen.

Wenn Sie also den Wert mit einem Referrer ändern, wird er am tatsächlichen Objekt im Speicher geändert und Sie erhalten den neuen Wert, wenn Sie darauf zugreifen, obwohl Sie diesmal eine andere Variable verwenden, die sich auf dasselbe Objekt bezieht Erinnerung.

+1

Was ist, wenn ich Integer anstelle von int benutze? –

+0

'Integer' ist im Grunde genommen eine Wrapper-Klasse für den primitiven Typ' int', also verhält es sich genauso wie bei 'int'. Sehen Sie sich eine Dokumentation über Java-Wrapper-Klassen an und Sie erhalten die Idee. – Abubakkar

+0

Kein Unterschied. Wie Sie in meiner Antwort sehen können, ist 'a ++' kurz für 'a = a + 1'. In dieser Situation wird Integer also auf int interniert, dann wird die Addition ausgeführt und erneut zu Integer für die Zuweisung autoboxiert. – Vampire

0

Im zweiten Fall wird Speicher für dieses Objekt erstellt. Und das Objekt y zeigt auf das Objekt x. Also greifen Objekt x und Objekt y auf denselben Speicher zu. Immer wenn wir eine Eigenschaft von Objekt x ändern, wird sie an diesem Speicherort gespeichert. Da das Objekt y auch auf den gleichen Speicherort verweist, werden die Werte auch in die Eigenschaften des Objekts y übernommen.

Im ersten Fall weisen wir einer Variablen nur Werte zu, wir weisen dieser Variablen keinen separaten Speicherblock zu.

0

Was passiert, wenn ich 'Integer' anstelle von 'int' verwende? Will b = 11?

Antwort: Integer ist eine Wrapper-Klasse, wenn wir Objekte verwenden, anstatt von primitiven Datentypen wollen wir Wrapper-Klassen verwenden. und "b" wird in beiden Fällen gleich sein. Wrapper-Klassen bietet einen Mechanismus zum Umwandeln von primitiven Typen in Objekte und Objekte in primitive Typen (Boxen und Un-Boxen)

Andere Teil wird von anderen Jungs gut erklärt, so fügen Sie nichts dafür hinzu.

0

Mit der Integer-Frage ist Integer in Java unveränderlich. Sie müssen eine neue Ganzzahl zum Erhöhen setzen. Daher wird es nicht funktionieren.

Der andere Teil ist bereits beantwortet.

Verwandte Themen