Generell gilt:
Mit der Sichtbarkeit bestimme ich auch die Lebensdauer (Wie lange muß es zur Verfügung stehen?) und damit den gesamten Speicherbedarf für ein Programm
Daher gilt als Grundsatz eine Variable so spät als möglich zu definieren und nur dort, wo sie gebraucht wird!
Der satische Speicher entspricht einem Object mit einer konkreten Speicheradresse.
Ein statischer Speicher ist per definition kein dynamischer! Daher kann statisch
nicht mit new() geladen werden da der Name für die Speicheradresse schon
vorhanden ist.
Dies bedeutet, alles was nur einmal verwendet werden darf, wo keine Identität
gefordert ist(-> Werte!), was dadurch nicht überschrieben werden kann,
und zur Lebensdauer des Programmes zur Verfügung stehen muß, im
statischen Speicher verwendet werden soll.
Jedes neue Object ist ein zusätzlicher neuer dynamischer Speicherplatz.
Der Referenzwert null löscht eine bestehende Referenz! Damit ist das Objekt nicht mehr erreichbar!
Leider können durch nachträgliche Größenänderung einer Collection Objecte, die nun ausserhalb des Indexes liegen, auch nie mehr erreicht und daher auch nie mehr gelöscht(!!) werden.
Wie im wirklichen Leben muß man sich vor Dreiecksbeziehungen in Acht
nehmen!
Annahme: Wir benötigen die Objecte a,b,c nicht mehr. Unsere Klasse zeigt
nur auf das Object a. Nun löschen wir die Referenz auf a.
Aber: Zeigt object a auf object b und dieses auf object c und dieses wiederum
auf object a, dann werden sie also laut der Speicherverwaltung immer gebraucht
und daher nie gelöscht!
Die Variable g wurde im static-Speicher definiert.
Sie ist daher in jeder Klasse sichtbar.(gilt auch für eine Methode)
Der statische Speicher legt für die Klasse A eine dynamische Speicheradresse an. (= generiert ein Object vom Typ A)
Die Variable f wurde in der Klasse A definiert. Sie ist daher nur innerhalb
der gesamten Klasse A sichtbar. (gilt auch für eine Methode)
Die Variable f wird mit der Instanzierung der Klasse A_A übergeben. Daher
sieht auch die Klasse A_A die Variable f, da die dynamische Speicheradresse
dem Konstruktor mitgegeben wurde!!
Die Klasse A sorgt dafür, daß die Klassen A_A und A_B in den dynamischen Speicher geladen werden.
Die Klasse B wird nie aufgerufen und ist daher für das Programm nicht vorhanden.
Die Variable e ist nur innerhalb der gesamten Klasse A_A sichtbar.(gilt auch für eine Methode)
Die Variable d ist nur innerhalb der gesamten Klasse A_B sichtbar. Sie kann daher von den Methoden methode1 und methode2 verwendet werden.
Die Variable b ist nur innerhalb der gesamten methode1 der Klasse A_B sichtbar.
Sie kann daher von der Methode2 der Klasse A_B nicht verwendet werden!
Erst wenn die methode1 der Klasse A_B verwendet wird, wird sie in den Speicher
geladen! Daher weiß bei Instanzierung der Klasse A_B - es wird also
nur die Adresse von A_B und die Namen ihrer möglichen Variablen und Methoden
angelegt, die virtuelle Maschiene nicht Bescheid wo sich die Variable b der
Klasse A_B befindet. Sie kann daher auch nicht von vornherein auf 0 gesetzt
werden. Daher müssen Variablen, die innerhalb von Methoden deklariert
werden, immer auf ihren Ursprungswert gesetzt werden!
Die Variable a ist nur innerhalb der for Schleife der methode1 der Klasse A_B sichtbar und wird daher nur dort verwendet.
Die Variable c ist nur innerhalb der methode2 der Klasse A_B sichtbar.
Müssen unterschiedliche Klassen auf Variablen anderer Klassen zugreifen gibt es zwei Möglichkeiten dies zu erreichen:
Wenn kein Konstruktor gebildet wird, wird immer ein, den anderen Klassen zugänglicher Defaultkonstruktor gebildet, der dann aber auch überschrieben werden kann! Wenn das unerwünscht ist muß ein private Konstruktor + eine entsprechende Instanzierungsmethode geschrieben werden.