Java Wann setzt man variablen static?

...komplette Frage anzeigen

5 Antworten

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 bewerten Vielen Dank für Deine Bewertung

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 bewerten Vielen Dank für Deine Bewertung

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 bewerten Vielen Dank für Deine Bewertung

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 bewerten Vielen Dank für Deine Bewertung

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.

Antwort bewerten Vielen Dank für Deine Bewertung
gut4fr5g4 17.09.2016, 23:07

muss man final variablen static machen?

0
PerfectMuffin 17.09.2016, 23:10
@gut4fr5g4

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

1
gut4fr5g4 17.09.2016, 23:16
@PerfectMuffin

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..." 

0
Rums777 17.09.2016, 23:49
@gut4fr5g4

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.

0

Was möchtest Du wissen?