Jetzt anmelden...

Login
Passwort
Registrieren

Java Tutorial #13

Statische Variablen und Methoden

Wir schauen uns in diesem Kapitel das Keyword static genauer an, mit dem wir unter anderen statische Variablen und statische Methoden einsetzen können. Das sind besonderes feiheitsliebende Programmteile, die nicht an Objekte einer Klasse gebunden sind, sondern unabhängig davon existieren.

Kommentare [0]

Stefan 07.09.2018

Infos zum Artikel

Kategorie Java
Autor Stefan
Datum 07.09.2018

Thema in Kurzform

  • Statische Variablen und Methoden benötigen keine Objekte, um eingesetzt zu werden. Sie werden in den Klassen selbst gespeichert.
  • Um eine statische Variable oder Methode zu definieren, verwenden wir das Schlüsselwort static direkt hinter dem Modifier.
  • Wenn wir eine statische Variable als unveränderliche Konstante festlegen wollen, ergänzen wir noch das Schlüsselwort final.

Statische Variablen

Statische Variablen unterscheiden sich von Instanzvariablen dadurch, dass sie unabhängig von einem Objekt (Instanz) existieren und stattdessen in der Klasse selbst gespeichert werden. Statische Variablen werden deshalb auch Klassenvariablen genannt.

Um eine Variable als statisch festzulegen, schreiben wir bei der Variablendeklaration das Keyword static hinter den Modifier. Zum Beispiel:

private static int preis = 3.50;

Sehen wir uns eine statische Variable innerhalb einer Klassendefinition an:

public class Cappuccino {

  private static double preis = 3.50;

  public void setPreis(double preis){
      this.preis = preis;
  }
}

Bereits jetzt, ohne dass schon Objekte der Klasse Cappuccino erzeugt wurden, ist die statische Variable preis existent. Erzeugen wir nun Objekte der Klasse Cappuccino, können all diese Objekte auf die gemeinsame statische Variable zugreifen. Testen wir das mal:

public class CappuccinoTest {

    public static void main(String[] args){
        Cappuccino c1 = new Cappuccino();
        Cappuccino c2 = new Cappuccino();
        Cappuccino c3 = new Cappuccino();

        c1.setPreis(3.00); // preis = 3.00
        c1.setPreis(1.50); // preis = 1.50
        c1.setPreis(1.00); // preis = 1.00
    }
}

Jedes der drei Cappuccino-Objekte ruft nacheinander die Methode setPreis() auf und jedes Mal wird der Wert der statischen Variablen preis entsprechend verändert. Die Objekte der Klasse Cappuccino teilen sich also die Klassenvariable.

In einer Grafik stellt sich das Verhältnis zwischen der Klassenvariablen und den drei Objekten so dar:

Java statische Variablen

public machen

aben wir aber nicht gesagt, dass wir für statische Variablen keine Objekte brauchen, da die Variable in der Klasse gespeichert wird? Wie können wir aber ohne Methodenaufruf auf Objekten die Klassenvariable benutzen?

Tatsächlich können wir (ganz ohne Objekte erzeugen zu müssen) mit folgender Schreibweise auf die Klassenvariable direkt zugreifen:
Klassenname.Variablenname

Damit das auch wirklich funktioniert, darf die Sichtbarkeit der statischen Variablen aber nicht private sein. Der Nachteil einer privaten statischen Variablen ist nämlich, dass ein Zugriff darauf ohne entsprechende Methode von außerhalb der Klasse ja eben nicht möglich ist.

Setzen wir die statische Variable also auf public:

public static int preis = 3.50;

Jetzt können wir auch von anderen Klassen aus (ohne Methodenaufruf) auf die Klassenvariable zugreifen:

public class CappuccinoTest {

    public static void main(String[] args){

        Cappuccino.preis = 4.50;
        System.out.println(Cappuccino.preis); // 4.50
    }
}

Achtung: Wir sollten uns immer gut überlegen, wie wir die Zugriffsstufe festgelegen. Zwar können wir mit public von überall aus auf die Klassenvariable zugreifen. Das bedeutet aber gleichzeitig auch ein erhöhtes Risiko für die Programmintegrität, da die Variable nicht mehr "geschützt" ist und ein ungewollter Zugriff auf die Klassenvariable jederzeit erfolgen kann.

Konstanten erstellen mit final

Wenn wir den Wert einer statischen Variable so festsetzen wollen, dass er nicht mehr verändert werden kann, können wir die Variable als unveränderliche Konstante definieren. Hierzu schreiben wir das Schlüsselwort final direkt hinter static. Die Klassenvariable preis sieht als Konstante dann so aus:

public static final double PREIS = 3.50;

Beachten Sie: Konstanten müssen sofort initialisiert werden. Das heißt: Deklaration und Initialisierung müssen in einem Schritt (in einer Anweisung) erfolgen.

Da final endgültig heißt, kann der Initialisierungswert der Variable nicht mehr verändert werden. Versuchen wir es dennoch, erhalten wir einen Compiler-Fehler:

public class CappuccinoTest {

    public static void main(String[] args){
        Cappuccino.PREIS = 4.50; // Fehler: Konstante darf nicht verändert werden!
    }
}

Konstanten werden außerdem immer in Großbuchstaben geschrieben. Diese Konvention ist guter Stil und dient zur Hervorhebung der Konstanten im Quellcode.

Statische Methoden

Mit dem Keyword static können wir nicht nur statische Variablen, sondern auch statische Methoden erzeugen.

Die Sache verhält sich dann analog zu Instanz- bzw. Klassenvariablen: Instanzmethoden benötigen ein Objekt, um aufgerufen werden zu können. Dagegen beziehen sich statische Methoden auf die Klasse und benötigen zur Ausführung daher kein Objekt (deshalb auch Klassenmethode genannt).

Um eine Methode als statische Klassenmethode festzulegen, schreiben wir das Schlüsselwort static direkt hinter den Zugriffsmodifier. Also:

public static void statischeMethode(){
System.out.println("Ich bin eine statische Methode der Klasse Cappuccino");
}

Aufgerufen wird die Klassenmethode sodann nach folgendem Muster:
Klassenname.Methodenname();

public class CappuccinoTest {

    public static void main(String[] args){
        Cappuccino.statischeMethode(); //Aufruf der statischen Methode
    }
}

Wussten sie schon? In jedem Java-Programm gibt es übrigens mindestens eine statische Methode. Es handelt sich dabei um die Ihnen bereits bekannte Main-Methode, die wir zum Starten des Programms benötigen.

Was statische Methoden nicht können

Wie wir gesehen haben, sind statische Methoden objektunabhängig. Das hat zur Folge, dass wir innerhalb statischer Methoden keine Instanzvariablen und Instanzmethoden aufrufen können. Diese benötigen ja zwingend ein Objekt. Der Compiler kann zum Zeitpunkt des Aufrufs der statischen Methode aber nicht davon ausgehen, dass ein solches Objekt auch wirklich exisitiert.

Der folgende Code lässt sich deshalb nicht kompilieren:

// ...
public static void statischeMethode(){
    System.out.println("Ich bin eine statische Methode der Klasse Cappuccino");
    setPreis(5.25);// Fehler!!
}

public void setPreis(double preis){ // Instanzmethode
    preis = preis
}

// ...

Warum funktioniert der Code nicht? Wir versuchen in diesem Beispiel eine Instanzmethode innerhalb einer statischen Methoden aufzurufen. Das kann aber, wie oben gesagt, nicht laufen. Auch ein Zugriff auf eine Instanzvariable dürfte innerhalb der statischen Methode nicht erfolgen.

Umgekehrt aber wäre das kein Problem. Um den Code wieder lauffähig zu machen, müssten wir entweder die statische Methode zu einer Instanzmethode bzw. die Instanzmethode zu einer statischen Methode umbauen.

Übungen

einfach

Was wird mit folgendem Code auf der Konsole geprinted?

public class Kaffee {

    private static String marke;

    public Kaffee(){
        marke = "Zibu";
    }

    public static void main(String[] args){
        Kaffee.marke = "Zibu2";
        System.out.println(Kaffee.marke);
    }

}

A. Fehler: Weil marke eine Konstante ist, muss sie unmittelbar beim Deklarieren einen Wert zugewiesen bekommen.
B. null
C. Zibu
D. Zibu2

Lösung ein-/ausblenden

mittel

Wieviele Fehler sind im folgenden Code?

public class Kaffee {

    private double preis = 2.55;
    public static final String MARKE = "Zibu";


    public Kaffee(){
        MARKE = "Eduxo";
    }

    private static String getInfos(){
        return "Preis: " + preis +
               "Marke: " + Kaffee.MARKE;
    }
}

A. keiner
B. einer
C. zwei
D. drei

Lösung ein-/ausblenden

schwer

Kurz und knapp: Schreiben Sie eine Klasse, in der die Anzahl der erstellen Objekte dieser Klasse gespeichert wird.

Verketten Sie die überladenen Konstruktoren!

Lösung ein-/ausblenden

Kommentar schreiben

Nur angemeldete und aktivierte Benutzer können kommentieren.

Alle Kommentare

Es gibt bislang noch keine Kommentare zu diesem Thema.

toString() Methode

Lernen Sie hier, wie Sie die toString() Methode korrekt einsetzen

Methoden in Java

Wie erstelle ich Methoden?

Schleifen in Java

Schleifenstrukturen gehören zu den wichtigsten Grundlagen in der Programmierung überhaupt.

FALCONBYTE.NET

Handmade with 🖤️

© 2018, 2019 Stefan E. Heller

Impressum | Datenschutz

facebook programmieren lernen twitter programmieren lernen youtube programmieren lernen