hallo
der sinn von objektorientierter programmierung ist es ja gerade, die daten zu kapseln - und das sind nunmal die objektinstanzen. klassenorientiertes programmieren ist im prinzip das selbe wie methoden- oder prozedurales programmieren. wichtig sind die datenstrukturen und dass nicht jeder irgendwie darauf zugreifen kann.
ausserdem würde ich stack und heap nicht als datenstrukturen bezeichnen - lediglich unterschiedliche strategien, wie eine programmiersprache den speicher verwaltet. stacks werden in java pro thread verwaltet - jeder thread bekommt dabei eine gewisse menge an speicher (defaultmässig 512 kb). dieser speicher ist wie ein stapel an zetteln organisiert (die deutsche übersetzung von stack ist stapelspeicher). wird eine methode aufgrufen, wird die rücksprungadresse auf den stack gelegt. auch lokale variablen liegen am stack. wird eine methode abgeschlossen, werden zuerst alle lokalen variablen wieder entfernt, dann die rücksprungadresse ausgelesen, dann diese entfernt und dann zurückgesprungen. an und für sich ein recht schnelles und effizientes system - allerdings nicht für grosse und/oder wachsende datenstrukturen geeignet. auch ist der stack für alle threads immer gleich gross. habe ich also einen thread, der viel platz am stack benötigt, muss ich den stack für alle threads vergrössern - was in einer massiv multithreaded umgebung einen enorme platzverschwendung bedeutet kann. bei einem intensiv genutzten http-server kommt man z.b. schnell auf 1000 gleichzeitige threads - bei 512 kb stacksize also ein halbes gigabyte speicher - egal ob der platz auch tatsächlich benötigt wird oder nicht.
der heap ist ein grosser speicherbereich, in den alle thread gemeinsam zugreifen können. es gibt recht ausgefeilte methoden wie man am heap speicher zugewiesen bekommt. auch gibt es eine automatik, die unbenutzten speicher wieder freigibt (garbage collector). da alle threads gemeinsam auf den heap zugreifen, kann man den etwas platzsparender anlegen. durch eine doppelte verpointerung (das java-programm bekommt nur einen objekthandle - der zeigt auf eine tabelle, in der die tatsächliche speicheradresse steht) kann der speicherbereich im hintergrund verschoben/umorganisiert werden, ohne dass das die verwendende methode mitbekommt. dadurch sind auch ständige grössenänderungen der datenstrukturen kein problem.
im java ist es so, dass alle objekte grundsätzlich am heap liegen. lokale variablen liegen am stack. habe ich eine lokale objektvariable, dann liegt die objektreferenz am stack, das objekt selbst am heap.
etwas besonderes sind die statischen variablen - die liegen im klassenspeicher. der klassenspeicher ist ein spezieller teil vom heap, der für normale methoden nicht ansprechbar ist. dort liegt nicht nur der code für die klassen selbst sonder auch eben alle variablen, die mit static deklariert sind.
lg
erwin
und was ist der Unterschied zwischen den Datenstrukturen Stack
und Heap?
außer das beim Stack methoden aufrufe verarbeitet werden und
beim heap die Objekte verarbeitet werden?