Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
Was ist ein statischer Konstruktor?Wann wird er aufgerufen und vorallem wie wird er erstellt? Und was ist generell der Unterschied zwischen statisch und dynamisch. :?: :?: :?:
static darf soweit ich weiß garnicht vor den Konstruktor einer Klasse gesetzt werden (wäre ja auch blöd, da der Konstruktor ja eine Instanz der Klasse erzeugt und Instanzen sind nicht statisch *g* )
static bedeutet, dass die Methode (oder Variable) zur Klasse gehört was sich wie folgt äußert: Klassenname.statischeMethode(); anstelle von objektname.methode();
Also statische Konstruktoren gibt es nicht! Alles was statisch (static) an einer Klasse ist, ist nicht an eine konkrete Objektinstanz der Klasse gebunden. Am besten sieht man das bei statischen Variablen. Wenn man zwei Instanzen einer Klasse hat und in einer Klasse eine statische Variable ändert, so ist die Änderung auch sofort in der zweiten Instanz der Klasse zu sehen. D.h. static Variable werden pro Klasse und nicht pro Instanz gespeichert.
Um eine Instanz einer Klasse anzulegen werden Konstruktoren verwendet. Erbt eine Klasse von einer anderen, so werden beim Instanziieren immer auch die entsprechenden Konstruktoren der Superklasse aufgerufen. Es wird also einfach die Hierarchie nach oben gewandert, dabei werden immer die Konstruktoren mit den gleichen Parametern verwendet, es sei denn man ruft selbst super() mit einer anderen Parameterzahl auf.
Statische Codeblöcke und Variablen werden nach dem Aufruf der Konstruktorhierarchie, aber vor dem ersten Aktion nach super() initialisiert.
Ich hoffe das hat etwas zur Verwirrung beigetragen.
Ich denke mal das nicht eine statische Methode gmeint ist sondern ein staic-Block !
Code:
public class Test {
static{
//irgendwelche Anweisungen
}
// ...
}
Sieht doof aus ... geht aber. Dieser Block wird dann ein einziges mal aufgerufen ... weiss allerdings nicht wann ... ob ganz am Anfang beim Programmstart oder bei der ersten Benutzung der Klasse. Man kann diesen Block auch nicht händisch noch mal aufrufen !
nennt sich static initializer. Der Grund dafür ist, dass statisch (also für die Klasse und nicht Instanzen der Klasse) Initialisierungen vorgenommen werden.
Static initializers sind statische Klasseninhalte und werden im Zuge der Initialisierung der Klasse aufgerufen; in der Reihenfolge wie sie im Code deklariert sind (v.o.n.u.). Das bedeutet nach dem Laden der Klasse werden alle statics der Reihe nach aufgeführt:
führt definitiv zu einer Ausgabe auf dem Standard Out von:
Code:
First Initialization
Second Initialization
Hat man jetzt eine Klassen-Hierarchie mit static initializers in erbender und beerbter Klasse
Code:
class A {
static {
System.out.println("Class A initializing...");
}
}
class B extends A {
static {
System.out.println("Class B initializing...");
}
}
führt dies definitiv zu einer Ausgabe auf dem Standard Out von:
Code:
Class A initializing...
Class B initializing...
Eine Klasse wird initialisiert, bevor Sie das erste mal benutzt wird. Das heißt, dass vor dem ersten Erstellen einer Instanz (Konstruktor-Aufruf), vor dem ersten Aufruf einer statischen Methode und vor dem ersten Abgreifen einer statischen Variable (oder Konstante) die Klasse initialisiert ist.
Das sind alle Regeln, die ich kenne.
:!: A.class ist keine Nutzung der Klasse im eigentlichen Sinn. Abhängig vom Compiler ist die Klasse dadurch initialisiert oder auch nicht. Streng nach der Maschinenspezifikation wird Klasse A dadurch nicht initialisiert, obwohl ältere Compiler dies anders sehen...