Coco: Heap/Steak und Static in Java

Beitrag lesen

MyStruct ms; //[1]
ms.SetI(1); //[2]
object obj = (object) ms; //[3]
((MyStruct)obj).SetI(5); //[4]


> In der ersten Zeile wird ein Speicherbereich/Wertebereich (Stack) erzeugt/reserviert.  
> In Zeile zwei die Zahl 1 darin gespeichert.  
> Zeile drei reserviert nun im Systemspeicher (Heap) Speicher und kopiert den Wert von dem Speicherbereich "ms" in den Heap. Unboxing?  
  
Nein, Boxing, du nimmst ja deine schöne ms-Variable und packst ihren Kram in die object-Kiste. Ansonsten richtig.  
  

> In Zeile 4, wird ein Speicherbereich/Wertebereich (Stack) reserviert und der Wert der Variable "obj" in den Stack kopiert. Man erhält dann die Adresse des Speicherbereichs.  
  
Richtig bis auf den letzten Satz, der gehört zu Zeile 3, dort landet eine Adresse in der Variablen obj.  
  
Dieser Vorgang nennt sich Unboxing.  
  
Der Autor wollte mit diesem Beispiel darauf hinweisen, dass man in Zeile 4 mitnichten das Objekt aus Zeile 3 verändert und schon gar nicht jenes aus Zeile 1, sondern ein drittes, das sich gleich am Ende dieser Zeile wieder in Wohlgefallen auflöst.  
  

> Mutterklasse var = new AbgeleiteteKlasse()  
> Macht aber, wie ich sehe kein Sinn, da man nur die Elemente dann von abgeleiteteKlasse nutzen könnte.  
  
Äh, nein. var ist vom Typ Mutterklasse, du kannst über var also nur Elemente von Mutterklasse benutzen. Dass es sich eigentlich um AbgeleiteteKlasse handelt, kann der Compiler nicht wissen, er sieht ja nur "Aha, var ist vom Typ Mutterklasse".  
  

> AbleiteteKlasse var = new Mutterklasse()  
  
Das geht in die Hose (wenn's der Compiler überhaupt annimmt). var ist ein Objekt vom Typ Mutterklasse und kennt dementsprechend nichts von AbgeleiteteKlasse. Mit dieser Konstruktion könntest du (wenn der Compiler nicht meckern täte, siehe oben) auf Dinge zugreifen, die überhaupt nicht vorhanden sind.  
  
Du kannst  
  
Mutterklasse var = new MutterKlasse()  
Mutterklasse var = new AbgeleiteteKlasse()  
AbgeleiteteKlasse var = new AbgeleiteteKlasse()  
  
nehmen, sonst nix.  
  

> Die Klasse A und B sind zwar von Thread abgeleitet und haben folglich deren Funktionalität. Muss man aber nicht die Methode "run" der Mutterklasse explizit aufrufen in Klasse A und B  
  
Richtig, das ist der Sinn der Vererbung.  
  
Es gibt allerdings durchaus die Möglichkeit, bei einer abgeleiteten Klasse explizit eine Methode der Mutterklasse aufzurufen. Das macht man, wenn die abgeleitete Klasse die Mutter-Methode durch eigenen Code ersetzt, also überschrieben hat, und man diesen Code umgehen will.