Java Tutorial #14

Statische Variablen und Methoden

2018-09-07 | credit: falconbyte.net

Thema in Kurzform

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 freiheitsliebende Programmteile, die nicht an Objekte einer Klasse gebunden sind, sondern unabhängig davon existieren.

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 double 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
        c2.setPreis(1.50); // preis = 1.50
        c3.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

Haben 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. Ein Zugriff darauf ist nämlich ohne entsprechende Methode von außerhalb der Klasse ja eben nicht möglich.

Setzen wir die statische Variable also auf public:

public static double 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 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 Variablen 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 existiert.

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

Werbung

Java lernen

Werde zum Java Profi!

PHP Lernen

Lerne serverbasierte Programmierung

JavaScript lernen

Skille dein Webcoding

FALCONBYTE.NET

Handmade with 🖤️

© 2018-2023 Stefan E. Heller

Impressum | Datenschutz | Changelog

Falconbyte Youtube Falconbyte GitHub facebook programmieren lernen twitter programmieren lernen discord programmieren lernen