# objekt löschen / null setzen



## sloka (16. Jan 2008)

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


```
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 (16. Jan 2008)

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.


----------



## sloka (16. Jan 2008)

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 ...


----------



## sloka (16. Jan 2008)

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


```
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 (17. Jan 2008)

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 (17. Jan 2008)

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 (17. Jan 2008)

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)


----------



## sloka (17. Jan 2008)

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


----------



## maki (17. Jan 2008)

Welches Problem willst du denn lösen?

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


----------



## Guest (17. Jan 2008)

```
public void verSchrotten(Raumschiff raumschiff){
                  raumschiff = null;
      }
```

das wenn ich

raumschiff.verSchrotten(gelbesRaumschiff);

aufrufe danach gelbeRaumschiff den wert null hat.


----------



## maki (17. Jan 2008)

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?


----------



## Guest (17. Jan 2008)

naja ich kann ein obj schon einfach auf null setzen wenn ich einfach sage 
	
	
	
	





```
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?


----------



## maki (17. Jan 2008)

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 (17. Jan 2008)

Du setzt immer nur Referenzen auf _null_.

```
Bla mb = new Bla();
```
Dann zeigt mb auf ein Bla-Objekt. Trotzdem ist mb nur eine Referenz.

```
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.


----------



## Guest (17. Jan 2008)

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 ...


----------



## maki (17. Jan 2008)

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.


----------



## C++ Pr0gg0r (18. Jan 2008)

Anonymous hat gesagt.:
			
		

> ok was mache ich wenn ein obj nicht mehr brauche?


Benuzte es einfach nicht.


----------



## alexpetri (18. Jan 2008)

falscher eintrag


----------



## maki (18. Jan 2008)

*Antwort auf falschen Eintrag*


----------

