static
-
Hallo
Hier mal eine Frage zum static-Modifizierer. Nach meinen bescheidenen Kenntnissen
wir eine Methode oder Variable die als static definiert wurde nur einmal erzeugt.
Unabhängig wie wie viele Instanzen man von der Klasse erzeugt. Hoffe das stimmt so ???Jetzt habe ich gehört das eine Methode die static definiert wurde immer ausgeführt wird, unabhängig davon ob die Methode nun aufgerufen wird oder nicht. Ist das richtig oder falsch???
-
mit static deklarierte Variablen werden pro Klasse nur einmal erstellt, das ist schon richtig ...
Aber static-Methoden werden nicht automatisch ausgeführt...
Eine Static Methode hat den Vorteil, dass man sie benutzen kann ohne ein Objekt davon zu erstellen. Dadurch kann sie aber auch nicht auf klassenvariablen zugreifen.
-
Vielleicht war der static-Block einer Klasse gemeint der automatisch ausgeführt wird sobald die Klasse in den Classloader kommt (sprich benötigt wird)
public class StaticTester { static { System.out.println("[StaticTester] Der Classloader hat mich soeben geladen!"); } public StaticTester() { System.out.println("[StaticTester] Von mir gibt es jetzt ein Objekt!"); } public static void main (String args[]) { StaticTester st = new StaticTester(); StaticTester2.x = 2; StaticTester2.x = 4; } } class StaticTester2 { public static int x = 0; public static int y = 0; static { System.out.println("[StaticTester2] Der Classloader hat mich soeben geladen!"); } public StaticTester2() { System.out.println("[StaticTester2] Von mir gibt es jetzt ein Objekt!"); } }
-
@CengizS
Jetzt wird interessant: Static-Block einer Klasse sagt mir ja nun garnichts. Der rest des Code ist ja recht einfach zu durchschauen. Was ist denn das und fuehr was wird der den gebraucht.
-
Das ist gewissermaßen der Konstruktor der Klasse.
Der Code wird aufgerufen, sobald die Klasse geladen wird
und dient dazu, Initialisierungen vorzunehmen die komplexer
sind, als reine Belegungen von Klassenvariablen.
-
Aber dafür gibt es den Konstruktor der Klasse. Das würde ja bedeuten das die Klasse oben zwei Konstruktoren besitzt. Das ist mir jetzt zu hoch.
-
Debian schrieb:
Aber dafür gibt es den Konstruktor der Klasse. Das würde ja bedeuten das die Klasse oben zwei Konstruktoren besitzt. Das ist mir jetzt zu hoch.
Mit den Konstruktoren erzeugt man Objekte. Wenn man keine Objekte erzeugen möchte, dann sollte man also auch keine Konstruktoren benötigen, um grundlegende Initialisierungen durchzuführen. Deshalb gibt es diese "Static Initializer". Damit kannst Du statische Initialisierungen vornehmen, also Initialisierungen, die an die Klasse gebunden sind und nicht an die Instanzen der Klasse.
Insgesamt nutzt man das aber eher sehr selten. ..."static" steht oft im Widerspruch zu objektorientierter Programmierung und in Java programmiert man typischerweise objektorientiert. Static Initializer haben letztendlich nur in seltenen Fällen eine Daseinsberechtigung.
-
Dann nehme ich meine Äußerung
Javaner schrieb:
Das ist gewissermaßen der Konstruktor der Klasse.
wieder zurück.
Mit Konstruktor der Klasse wollte ich nur veranschaulichen,
daß der Code beim Laden der Klasse aufgerufen wird anstatt bei
Erzeugung einer Instanz der Klasse (was dann selbstverständlich
der Konstruktor einer Instanz ist).
-
Danke jetzt habe ich das glaube ich begriffen.(Nach drei mal lesen )
-
Zur Ergänzung (falles aus den obigen Ausführungen nicht hervorgeht). Static initializer werden nur EINMAL beim Laden der Klasse durchlaufen; es können mehrere solcher Blöcke vorhanden sein, die in der Reihenfolge abgearbeitet werden wie sie im Code stehen.
-
CengizS schrieb:
Zur Ergänzung (falles aus den obigen Ausführungen nicht hervorgeht). Static initializer werden nur EINMAL beim Laden der Klasse durchlaufen; es können mehrere solcher Blöcke vorhanden sein, die in der Reihenfolge abgearbeitet werden wie sie im Code stehen.
Hört sich nach ner guten Frage an, heh?!
-
Gregor schrieb:
CengizS schrieb:
Zur Ergänzung (falles aus den obigen Ausführungen nicht hervorgeht). Static initializer werden nur EINMAL beim Laden der Klasse durchlaufen; es können mehrere solcher Blöcke vorhanden sein, die in der Reihenfolge abgearbeitet werden wie sie im Code stehen.
Hört sich nach ner guten Frage an, heh?!
...wobei ich gerade festgestellt habe, dass es da schon eine entsprechende Frage gibt.