Static Attribute in einer Klasse, wie geht das? :O

berndoa

Top Contributor
Hallo,
in meinem Vorlesungsskript kommt als Beispiel etwas vor a la


Java:
class Block{



   static int az=0;

    Block(int parameter1){
        //....
        az++;
    }
   
   
}

Im Fließtext dazu stand dass hier az letztlich angeben würde
wie viele Instanzen von Block seit Start des Skripts erzeugt worden wären.
Stimmt das wirklich so?
Kann ich dass so immer machen?

Ich verstehe das nicht ganz,
kann mir da Jemand den Ablauf erklären wie das Alles funktioniert?

Existiert diese Variable az unabhängig von Zeit und Raum und unabhängig davon
ob diese Datei Block.java jemals irgendwie benutzt wird?

Also kann ich aus einem anderen Programm heraus einfach Block.az aufrufen ohne je irgendwie das Block progamm je komiliert zu haben oder je ein Block Objekt erschaffen zu haben?

Kann mir das gar nicht so vorstellen :-/

Wie funktioniert sowas?
 
Zuletzt bearbeitet:
Da fehlt noch das static vor az.

Ansonsten ja, eine static Variable existiert nur einmal in der JVM (wahrscheinlich je ClassLoader) und benötigt keine Instanz.
 
Lol, schön, wenn im Nachhinein so ein Post editiert wurde - man schaut und wundert sich, dass @mihe7 das static einfach nicht sieht 🙂
Das tut mir jetzt Leid, dass wegen mir @mihe7 blöd da steht :-(

Dachte, ich fix es noch shcnell bevor sich noch mehr Leute beschweren.

Ja, ich hätte das gerne besser verstanden wie man diese statische variable aus einem anderen programm heraus benutzt oder auch nicht.
Oder wie man die überhaupt benutzt.

Weil irgendwie kann ich mir das nicht so wirklich vorstellen.

Irgendwie scheint mir diese variable ja schon mit 0 initialisiert zu sein rein dadurch dass dieses Programm existiert. oder wird die nur deklariert und erstellt wenn ich das Programm auch ausführe?

Oder kann ich bspw, in einem anderen Programm 2 Block Objekte erzeugen und mir dann sagen lassen was der Wert von az ist (der ja nun 2 sein sollte)?

Ich checke das irgendwie nicht, statisches kram ist mir mehr oder weniger ein Mysterium, gerade wo das Attribut hier innerhalb der selben Klasse vorkommt und im Konstruktor inkrementiert wird 😵
 
Das tut mir jetzt Leid, dass wegen mir @mihe7 blöd da steht :-(
Da musst Du Dir keine Gedanken machen. Das ist nicht so schlimm und die Welt ist in Ordnung.

Was ich mache, wenn ich etwas nachträglich noch editiere: Ich schreibe unten drunter noch ein Edit: mit Hinweis, was ich geändert habe.

Aber das ist jetzt nichts, wo irgend jemand wirklich böse wäre - siehst Du ja auch am Lacher von @mihe7.
 
Um noch einmal auf die ursprüngliche Frage zurückzukommen:

Eine Variable (auch static) ist immer nur im laufenden Programm gültig.
Deine Variable "az" wird also bei jedem Neustart des Programmes immer wieder mit 0 initialisiert.
Um eine eindeutige Nummer zu erzeugen (zum Beispiel eine Kundennummer), wird normalerweise eine Datenbank benutzt.

Wenn du "static" nicht verstehst, ist dies gut; denn als Anfänger ist es normalerweise ein Fehler, "static" (außer vor der main) zu benutzen.
 
Vielleicht mal noch ein paar anschauliche Beispiele dazu.

"Normale" Klassen mit Instanzvariablen oder Instanzmethoden, sind dir ja hinreichend bekannt.
Java:
class Foo {

    public int value; // normalerweise natürlich private

    public void doSomething() {
   
    }
}

Der Zugriff erfolgt, wie gewohnt, über eine Instanz der Klasse:
Java:
Foo foo1 = new Foo();

foo1.value = 42;
foo1.doSomething;

Foo foo2 = new Foo();

foo2.value = 5;

System.out.println(foo1.value); // 42
System.out.println(foo2.value); // 5

Instanzen der Klasse sind, wie man sieht, unabhängig voneinander, "value" existiert in beiden Instanzen (und auch in allen weiteren).

Statische Variablen oder Methoden nennt man dagegen auch Klassenvariablen oder Klassenmethoden.
Java:
class Foo {

    public static int value;

    public static void doSomething() {
   
    }
}

Im Gegensatz zu Instanzvariablen/-methoden können (und sollten) sie über die Klasse aufgerufen werden.
Java:
Foo.value = 42;

Foo foo2 = new Foo(); // das funktioniert weiterhin

System.out.println(Foo.value); // 42
System.out.println(foo2.value); // 42

Wie man sieht, gibt es "value" nur einmal für die Klasse (oder für alle Instanzen dieser Klasse).

Kombinieren kann man das natürlich auch und damit z. B. zählen, wieviele Instanzen erzeugt wurden.

Statische Methoden werden gerne für Utiltity-Klassen (Math) genutzt. Aber auch andere Java-Klassen haben statische Methoden z. B. Integer.parseInt().
 
Zuletzt bearbeitet:
Vielleicht mal noch ein paar anschauliche Beispiele dazu.

"Normale" Klassen mit Instanzvariablen oder Instanzmethoden, sind dir ja hinreichend bekannt.
Java:
class Foo {

    public int value; // normalerweise natürlich private

    public void doSomething() {
  
    }
}

Der Zugriff erfolgt, wie gewohnt, über eine Instanz der Klasse:
Java:
Foo foo1 = new Foo();

foo1.value = 42;
foo1.doSomething;

Foo foo2 = new Foo();

foo2.value = 5;

System.out.println(foo1.value); // 42
System.out.println(foo2.value); // 5

Instanzen der Klasse sind, wie man sieht, unabhängig voneinander, "value" existiert in beiden Instanzen (und auch in allen weiteren).

Statische Variablen oder Methoden nennt man dagegen auch Klassenvariablen oder Klassenmethoden.
Java:
class Foo {

    public static int value;

    public static void doSomething() {
  
    }
}

Im Gegensatz zu Instanzvariablen/-methoden können (und sollten) sie über die Klasse aufgerufen werden.
Java:
Foo.value = 42;

Foo foo2 = new Foo(); // das funktioniert weiterhin

System.out.println(Foo.value); // 42
System.out.println(foo2.value); // 42

Wie man sieht, gibt es "value" nur einmal für die Klasse (oder für alle Instanzen dieser Klasse).

Kombinieren kann man das natürlich auch und damit z. B. zählen, wieviele Instanzen erzeugt wurden.

Statische Methoden werden gerne für Utiltity-Klassen (Math) genutzt. Aber auch andere Java-Klassen haben statische Methoden z. B. Integer.parseInt().
Statische Methoden verwirren mich nicht allzu sehr,
mich verunsichern eher wie im Eingangs Beispiel statische Attribute , die aber modifiziert werden.

Wie hier scheint ja die static vairable shcon per se zu existieren, wird aber durch jede Konstrukturoaufrufung erneut verändert.

Und ich kann mir geistig einfahc nicht recht klar machen ab wann ein statisches Attribut beginnt zu existieren?

Existiert es schon solange es ein Programm mit einer Klasse mit dem attribut im selben ordner gibt?
Existert es erst wenns kompiliert ist?
Oder erst wenn das Programm auch ausgeführt wurde und dmait die Main methode der Klasse ausgeführt wurde (namentlich 'java Klassenname' in der Konsole)?

Bei Klassen mit nicht-statischen Attributen ist es klar:
Ab Objekterzeugung existiert auch jenes Objekt Attribut.

Aber ein auch bei Nicht-Instanzierung exisiterendes Attribut, wo oder wann beginnt dessen Leben? :O

ich meine, wenn ich bspw. 2 java Programme A und B mit entsprechender Klasse drin habe und A enthält ein statisches Attribut 'static int v=5;, kann ich dann das Programm B ausführen lassen und darin mittels A.v auf das Attribut mit Wert 5 zugreifen obwohl ich weder die Klasse A ausühre noch irgendein objekt dieser Klasse erzeuge im Rahmen meines ausgeführten B Programms?

Ab wann wird überhaupt die variable A.v mit dem Wert 5 initialisiert? Ist sie es von Anfang an? oder wird sie erst definiert und initialisiert wenn an mittels A.v versucht auf sie und ihren Wert zuzugreifen?

Kurzum wann beginnt oder endet der lebensbereich einer Klassenvaraible oder -attributs?
Beim Objekt hängt Alles darin von der lebensdauer des Objekts ab.
Aber bei einer Klasse, die ja im Prinzip keinen durch ein Programm oder Befehl hervorgerufenen Beginn hat?
 
Und ich kann mir geistig einfahc nicht recht klar machen ab wann ein statisches Attribut beginnt zu existieren?
Mit dem Laden der Klasse.

Java-Klassen werden geladen, wenn Sie im Programm benötigt werden.

Also wenn auf ein static field zugegriffen wird (Ausnahme sind primitive Konstanten die vom Compiler ge-inlined werden)

und

wenn eine Instanz der Klasse oder einer abgeleiteten Klasse erzeugt werden soll.
 
Das mit dem Lebensbereich ist schwer zu sagen, da es nicht exakt spezifiziert ist.

Bei der normalen Java VM existiert die Variable, sobald die Klasse geladen wird vom Classloader. Also spätestens beim ersten Zugriff auf die Klasse muss der Classloader die Klasse geladen haben. Wenn die Klasse in einem jar File ist, werden in der Regel alle Klassen des JAR Files auf einmal geladen.

Generell gibt es aber auch andere Lösungen. GraalVM z.B. Wenn hier der Java Code in ein native Executable übersetzt wird, dann kann die Variable direkt mit start der Programmes existieren.
 

Zurück
Oben