objekt löschen / null setzen

Status
Nicht offen für weitere Antworten.
S

sloka

Gast
ich hab eine methode von einer class die in so aussieht:

Code:
public class Raumschiff {
	
		public void verSchrotten(Raumschiff raumschiff){
						raumschiff = null;
		}

}


aber raumschiff wird nicht auf null gesetzt !

kann mir das jemand erklaeren und mir vielleicht sagen wie ich das machen muss?


vielen dank
 

Wildcard

Top Contributor
Java ist call-by-value, nicht call-by-reference.
Du setzt die Variable raumschiff zwar auf null, das betrifft aber nur die als Parameter übergebene Referenz.
 
S

sloka

Gast
naja ... hab ich auch gedacht aber java hat mir mich da in letzter zeit in diesem thema was beleert .... zb wenn ich ein array über gebe macht java call-by-reference ...
 
S

sloka

Gast
... und so was wir hier farbe aendern geht ja auch ...

Code:
public class Raumschiff {
	
		private int farbe = 1;
		
		public void verSchrotten(Raumschiff raumschiff){
						raumschiff = null;
		}
		
		public void farbeVonFremdenRaumschiffAendern(Raumschiff raumschiff, int farbe){
			raumschiff.farbe = farbe;
		}

}
 

Wildcard

Top Contributor
Nein, es gibt kein call-by-reference.
Bei deinem Farb Beispiel änderst du das gleiche Objekt über verschiedene Referenzen. Denn nur die Referenzen werden übergeben (als Kopie) und daher ist es by-value
 

Evolver

Bekanntes Mitglied
Als ich damal Java gelernt habe, hat mir das die folgende Aussage endlich klar gemacht:

Es ist call-by-value, da der Wert einer Referenz übergeben wird. ;)

Setzt du dann in der Funktion die Referenz null, so "zeigt" ja die Originalreferenz trotzdem noch auf das ursprüngliche Objekt, da nur Referenz in der Methode verändert wird. Manipulierst du hingegen das Objekt, auf das die Referenz "zeigt", so gilt die Änderung überall, da es sich ja um das selbe Objekt handelt.
 

Marco13

Top Contributor
Eine Referenz explizit auf 'null' zu setzen sollte praktisch nicht notwendig sein (bei einem Anfänger nicht, und ansonsten nur in den allersentensten Fällen)
 
S

sloka

Gast
vielen dank Evolver und Wildcard das hab ich jetzt verstanden.

aber hat den einer ne idee wie ich es dann machen kann das es den effekt hat den ich haben möchte?

Eine Referenz explizit auf 'null' zu setzen sollte praktisch nicht notwendig sein (bei einem Anfänger nicht, und ansonsten nur in den allersentensten Fällen)

@Marco13 weist du vieleicht was man dann den in allersentensten Fällen machen kann?

... in c++ koennte man jetzt einfach einen pointer nehmen.

was mir dazu einfaellt:

"Mit C ist es einfach sich in den Fuss zu schiessen. Mit C++ ist es schwerer, wenn man es aber tut, bläst es einem gleich das ganze Bein weg!"

Bjarne Stroustrup, Erfinder von C++.


tja wenn ich mir mit java in den fuß schießen könnte haette ich das problem schon gelöst
 
M

maki

Gast
Welches Problem willst du denn lösen?

Ps: Stroustrup hat einen an der Klatsche, merkt man sehr deutlich wenn man sein Buch liest..
 
G

Guest

Gast
Code:
public void verSchrotten(Raumschiff raumschiff){
                  raumschiff = null;
      }

das wenn ich

raumschiff.verSchrotten(gelbesRaumschiff);

aufrufe danach gelbeRaumschiff den wert null hat.
 
M

maki

Gast
Das geht nicht, ich verstehe auch nicht was es bringen sollte... wie bereits von den anderen erwähnt, kannst du Objekte in Java nicht einfach so "auf null setzen" oder "löschen".

Wozu denn auch?
 
G

Guest

Gast
naja ich kann ein obj schon einfach auf null setzen wenn ich einfach sage
Code:
obj = null;
.

ok was mache ich wenn ein obj nicht mehr brauche? ich setze das obj auf null und dann wird es vom GC auf gesammelt.


oder wie geht man bei so was vor?
 
M

maki

Gast
Wie bereits gesagt, als Anfänger solltest du dich um so etwas nicht kümmern.

Falls doch, reicht es wenn alle Referenzen auf dieses Objekt auf null gesetzt werden, d.h. gelbesRamschiff etc.

Aber wie bereits mehrfach erwähnt, in Java ist das normalerweise nicht dein Problem sondern Aufgabe des GC.

Nachtrag: Wie bereits gesagt, setzt du keine Objekte auf null sondern Referenzen, Objekte kannst du nicht "setzen" oder "umsetzen".
 

Evolver

Bekanntes Mitglied
Du setzt immer nur Referenzen auf null.
Code:
Bla mb = new Bla();
Dann zeigt mb auf ein Bla-Objekt. Trotzdem ist mb nur eine Referenz.
Code:
mb = null;
Du setzt die Referenz auf 'null'. Ob das Objekt selbst gelöscht wird, das weißt du nicht. Ein Objekt wird dann entfernt, wenn keine Referenz auf es mehr vorhanden ist.
 
G

Guest

Gast
genau wenn da in deinem bsp die keine referenz mehr auf das obj da ist müsste es ja dann vom GC gelöscht werden ...
 
M

maki

Gast
Nö, wann der GC Objekte löscht lässt sich nicht so einfach vorhersagen.

Vergiss es einfach, du hast kein Problem, das macht man so in Java, musst dich nur daran gewöhnen.
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen


Oben