Frage von gut4fr5g4, 52

Java Wann setzt man variablen static?

Man könnte ja alle Variablen static setzen, die man aus anderen klassen abruft und die, die für jede instanz unterschiedliche werte annehmen sollen nicht... ist das gut so? wenn nein, was muss ich static setzen?

LG

Antwort
von androhecker, 24

Das ist der Punkt an OOP, wenn man OOP verstanden hat, dann versteht man auch statische Variablen/Methoden.

Ich erkläre das mal an einem Beispiel, der Klasse Mensch.

Wenn man eine nicht statische Variable oder Methode in dieser Klasse erstelle, dann hat jedes Objekt dieser Klasse einen Wert dazu, die Klasse selbst jedoch NICHT.

Zum Beispiel:
private int height;

Um diese Variable nutzen zu können, muss man einen Mensch erstellen, dieser hat dann seinen eigenen Wert von height. Direkt über Mensch.height kann man das natürlich nicht aufrufen, denn nur das Objekt von Mensch hat diese Eigenschaft, die Klasse nicht.

Eine statische Variable/Methode ist nicht eine Eigenschaft des Objektes einer Klasse, sondern der Klasse selbst. Verwirrend kann dort nur sein, dass man diese Methoden/Variablen dann trotzdem über ein Objekt der Klasse aufrufen kann (sollte man nicht machen).
Also hat in dem Fall nicht jedes Objekt seinen eigenen Wert, sondern es gibt nur einen Wert, den der gesamten Klasse.

Beispiel:
private static int humanCount; (Anzahl aller erstellen Menschen)

Es ergibt keinen Sinn, dass die Anzahl aller Menschen eine Eigenschaft von jedem einzelnen Mensch ist. Anstatt dessen ist es eine Eigenschaft der Klasse Mensch (man könnte auch sagen statisch -> gilt für Instanzen), also kann man diese Variable auch direkt über Mensch.humanCount aufrufen, denn der Wert diese r Variable gehört ja der Klasse an. Wenn nun in einem Objekt von Mensch auf die Variable humanCount zugegriffen wird, wird also nicht auf den den Wert des Objektes, sondern der Klasse zugegriffen.

Generell solltest du möglichst static vermeiden, ausgenommen sind da Konstanten die immer gelten.
Zum Beispiel:
private static final int MAX_AGE = 100;
Das gilt für alle Menschen gleich und nicht für jedes Objekt einzeln.

Antwort
von BigReddy, 4

static Variablen, also statische Variablen sollten vermieden werden.
JEDOCH: Gilt ein Wert oder ein Objekt unabhängig von dem Objekt der Klasse für ALLE Objekte dieser Klasse, z.B. die maximal Anzahl von Objekten dieser Klasse, ist es sinnvoll diese static zu setzten.

Faustregel:
Ist dieses Objekt (Wert/Variable/...) abhängig von der Klasse oder hängt es vom Objekt (der Klasse) ab?
von der Klasse -> static
vom Objekt -> nicht static

Antwort
von triopasi, 34

Grundsätzlich: Nichts static machen, außer du hast nen guten Grund dazu.

Static wenn du die ohne Instanz der Klasse aufrufen möchtest.

Beispiel: Die Methoden in der Hauptklasse eine Konsolenanwendung sind static. Sonst müsstest du wenn du in der main etwas aufrufen willst folgendes tun:

ThisApp app = new ThisApp();
app.myFunction()

Da es aber static ist kannst du einfach

myFunction();

nutzen.

Lese dir mal durch was static bedeuted.

Antwort
von PerfectMuffin, 27

Der einzige Sinn eines NICHT static-attributes ist die Verwendung von Instanzvariablen(bzw. Funktionen).

Das klingt für einen Anfänger nach sehr wenig, aber wenn du OOP beherrschst, werdne 80% deiner Funktionen und 90% deiner Variablen nicht statisch sein.

Antwort
von Rums777, 33

So funktioniert static. Ob das sinnvoll ist, wage ich mehr zu bezweifeln (static class oder interface möglich?). Ich würde nie mit static arbeiten, das ist zu unzuverlässig und nicht variabel.

Kommentar von gut4fr5g4 ,

muss man final variablen static machen?

Kommentar von gut4fr5g4 ,

bzw sollte man?

Kommentar von PerfectMuffin ,

Nein, es kommt aber eher selten vor, dass eine nicht statische Konstante für irgendetwas zu gebrauchen ist.

Kommentar von gut4fr5g4 ,

also nochmal zusammengefasst, was muss ich unter welchen umständen static setzen?

man kann ja immer sagen " ich setze alles static, dann kann ich es aus der anderen klasse ohne instanz abrufen..." 

Kommentar von Rums777 ,

Static ist viel fehleranfälliger, dadurch, dass keine Instanz erzeugt werden muss. Allerdings muss dann mit Referenz auf die Klasse aufgerufen werden.

Generell ist es aber im Code angesehener, wenn kein Static (bzw nur die Main-Methode) verwendet wird. Genauso sollten alle Variablen auf private/protected gesetzt werden.

Keine passende Antwort gefunden?

Fragen Sie die Community