Coco: Heap/Steak und Static in Java

Beitrag lesen

http://blogs.escde.net/jochen/archive/2007/06/13/79.aspx
Was ist denn nur ganz grob der Vorteil, wenn man in der Programmiersprache noch zwischen Speicherstellen wie Heap und Stack unterscheiden?

Obacht, darum geht es in dem Artikel eigentlich nicht, die Überschrift ist etwas schlecht gewählt.

Ein Werteobjekt ist ja kein Referenz-Typ.

Eben. Genau darum geht es.

An sich wäre aber praktisch das "ms" ja eine Referenz?

MyStruct ms;
ms.SetI(1);

Nein, ms ist hier ein Speicherbereich, eine Wertvariable, wie es bei Microsoft heißt. Eine Referenz steht in obj aus der darauf folgenden Zeile, die du leider nicht mitzitiert hast:

object obj = (object) ms;

Mit Heap und Stack hat das Ganze nur intern zu tun. Der Punkt bei der ganzen Angelegenheit ist, dass man in bestimmten Situationen nicht den Speicherbereich, also den Wert an sich haben will, sondern die Adresse desselben, also eine Referenz auf einen Wert.

Beim Boxing wird ein Speicherbereich reserviert, der Wert der zu verschachtelnden Variablen in diesen Speicherbereich kopiert und die Adresse des Speicherbereichs zurückgegeben. Im obigen Beispiel landet die Adresse in der Variablen obj (die übrigens ihrerseits auf dem Stack liegt, aber das tut –wie gesagt– nichts zur Sache).

Dass lokale Variablen auf dem Stack angelegt werden (wie ms) und man Speicher nur aus dem Systemspeicher (Heap) reservieren kann (wie für den in obj verschachtelten Wert von ms), liegt in der Natur der Dinge und hat mit dem Sinn und Zweck der ganzen Aktion, eine Referenz auf einen Wert statt eines Wertes zu erhalten, Nullkommagarnichts zu tun.

Von Microsoft ist das unter http://msdn.microsoft.com/de-de/library/cc749744.aspx#XSLTsection130121120120 recht anschaulich beschrieben.

// Skript "Synchronisation", p6

class A extends Thread {

class B extends Thread {

A a = new A();
    B b = new B();

Ich frage mich nur, obwohl A und B von Thread abgeleitet ist, warum das gleich beim Objektbilden zu nem Thread wird, da ja A a = new A() aufgerufen wird, anstatt Thread a = new A();

Schau doch nochmal hin: A ist eine Unterklasse von Thread. Kaufst du ein A, bekommst auch einen Thread. Die Funktionalität der Klasse hängt an der Klasse und nicht am Typ der Variablen.