2015-11-08 1 views
7

In Java auf null, wie würde ich Folgendes tun:alle Referenzen des Objekts Set

Foo bar = new Foo(); 
Foo a = bar; 
Foo b = bar; 
bar = null;//will only set bar to null. want to set value of bar to null rather than the reference to null. 

Ist es möglich, bar die Variablen zu setzen, a und b (alle sind ein Hinweis auf bar) nur auf null mit Zugang zur Bar? Wenn ja, könnte jemand bitte erklären, wie es geht.

+2

Nein Dies ist in Java nicht möglich. Die Regeln zum Zuweisen von Variablen bedeuten, dass Sie den Namen einer Variablen verwenden müssen, um sie zuzuweisen. – Nayuki

+0

Ich denke, dass, wenn Sie bar auf null setzen, auch a und b einen Nullbezug haben. Oder was ist das Problem? –

+0

Bitte lesen Sie dieses Tutorial: http://www.javaranch.com/campfire/StoryPassBy.jsp – Nayuki

Antwort

3

In Java ist dies nicht möglich. Sie können die Referenz a und b null nicht unter Verwendung von bar setzen.

Grund - Java ist pass by value nicht pass by reference.

+11

Ich glaube nicht, dass dies der richtige Grund ist. "Wert/Referenz übergeben" sind Auswertestrategien für Methodenaufrufe. Hier wird keine Methode aufgerufen. – xehpuk

5

Nein, das ist in Java nicht möglich.

Ich erkläre ein wenig, was in Ihrem Code passiert ist. Hier Foo bar = new Foo(); Sie erstellt Objekt von Foo und Verweis auf die Variable bar.

Hier Foo a = bar; und Foo b = bar; setzen Sie die Referenz auf die Variablen a und b. Sie haben jetzt ein Objekt und drei Variablen, die auf ihn zeigen.

Hier bar = null; löschen Sie die bar Variable. Sie haben also zwei Variablen (a und b), die auf das Objekt und eine Variable (bar) ohne Bezug zeigen.

2

Es ist nicht wirklich ein destructor in Java wie es in C:

Wenn Sie wüssten, dass Sie mehrere Objekte auf null, dann würden Sie wahrscheinlich verwenden, setzen wollten ein Array von Foo, anstatt sie als separate Objekte zu deklarieren. Verwenden Sie dann Schleifen für Konstruktoraufrufe, Initialisierung/Initialisierung.

Foo bar = new Foo(); 
Foo array[2] 
for (int i=0; i<array.length; i++) { 
    array[i] = bar; 
} 

Dann könnten Sie eine Schleife am Ende verwenden

for (int i=0; i<array.length; i++) { 
    array[i] = null; 
} 

Dies ist die Strategie, die Sie für die Datenstrukturen wollen würde, weil Sie eine beliebige Anzahl von Objekten umgehen kann, für Rekursion usw.

+0

BTW, wenn Sie a = bar sagen, kopieren Sie den Wert von bar in a. Der Wechselbalken ändert die kopierten Werte in anderen Speicherbereichen nicht. Ich weiß, dass Mathe-Leute manchmal annehmen, dass dieses Gleichheitszeichen auch nach der Tat immer noch wahr ist, in C und Java ist das eine doppelte == ist zweisymmetrisch.Das single = nennt man eine Zuweisung, man kann es sich eher wie einen asymmetrischen Pfeil nach links vorstellen. Wenn Sie in Java ein Objekt auf null setzen, ist dies das C-Äquivalent zum Aufrufen eines Destruktors. –

+0

Betreff: "möchte den Wert von bar auf null und nicht auf Null setzen" Der ASCII-Wert 0 repräsentiert buchstäblich null, was definitionsgemäß das Ende einer Zeichenkette oder eines Objekts ist (deshalb nennen wir sie nullterminierte Zeichenketten)). Wenn also der Wert im Speicher auf Null geändert wurde, wäre es kein Foo-Objekt mehr, da es nicht die erforderlichen Elementfunktionen, Elementvariablen usw. hätte, wie sie in der Klasse definiert sind. –