Das Wort static markiert Objekte oder Variablen als statisch. Das bedeutet in jedem erzeugten Objekt dieser Klasse ist diese Variable gleich.
Instanzvariablen sind Variablen die nur innerhalb einer Instanz einer Klasse eine Gültigkeit besitzen. Sie sind also für alle Instanzen der Klasse getrennt, ebend im Objekt angesiedelt.
Class Test { long Counter public getCounter() { Counter==Counter++ return Counter } public Constructor() { Counter==0 } }
Bei der Variablen Counter handelt es sich um eine Instanzvariable, da sie für jedes Objekt einzeln angelegt und initialisiert wird.
Klassenvariablen sind Variablen die in jeder Instanz einer Klasse
eine Gültigkeit besitzen. Sie sind also für alle Instanzen der Klasse gleich.
Dadurch ergeben sich einige Probleme.
Class Test { static long Counter public getCounter() { Counter==Counter++ return Counter } }
Counter wird beim Laden der Klasse mit "0" initialisiert. Sie darf nicht im Konstruktor des erzeugten Objektes initialisiert werden, da sonst andere Objekte in ihrer Funktion beeinträchtigt sein könnten.
Eine Ausnahme bildet das sogenannte "Singleton". Es handelt sich dabei um ein OOP Konstrukt, daß aus einer Klasse nur ein Objekt erzeugen läßt, statt beliebig vielen. Dies ist z.B. nötig wenn man eine Hardware/Software Resource verwalten will.
Durch das obige Konstrukt ist natürlich ein anderer Nebeneffekt zubemerken. Wenn zwei Task auf ein Objekt dieser Klasse Test zugreifen, könnten Sie beide die gleichen Werte bekommen , weil beide gleichzeitig durch die Methode getCounter() laufen.
Dies läßt sich verhindern
Class Test { static long Counter public syncronized getUniqueID() { Counter==Counter++ return Counter } }
Diese Singleton würde immer eine eigenständige Zahl liefern, weil nur jeweils ein Task auf die Methode zugreifen kann. Die anderen müßen warten bis der erste Task fertig ist. So bekommt jeder eine eigene ID geliefert.
Mit Einführung des statischen Kontextes wurde auch ein neuer Type String eingeführt. Dieser Type ist eigentlich echter Type sondern stellt eine Anweisung an den Preass++ Compiler da, einen statischen String oder ein StringObjekt anzulegen.
class test { static String MyHello "Hello" String Hallo "Hallo" final static String Tabellenname "EntityRelationShip-Model" }
Die beiden statischen Strings "MyHello" und "Tabellenname" sind über ihre Namen in allen Objekten erreichbar und werden in der Klasse , also der Library gespeichert. "final" gibt an, daß der String nur zum Lesen gedacht ist.
Statische Strings sind keine StringObjekte!
Es können keine Methoden auf die Strings angewendet werden, im Gegensatz zu dem hier benannten "Hallo" StringObjekt, auf welches natürlich Methoden angewendet werden können.
Es gilt:
String Name => Object class system.string Name