Was ist der Unterschied zwischen “static” und “final”? Wann werden statische Methoden verwendet?

Was ist der Unterschied zwischen static und final?

Static und final sind Schlüsselwörter, die recht unterschiedliche Sachverhalte beschreiben.

Mit dem Schlüsselwort static wird festgelegt, dass eine Variable oder Methode zu einer Klasse gehört und nicht zu einem Objekt. Das heißt, alle Instanzen einer Klasse greifen auf ein und dieselbe statische Variable zu.

Beispiel:
Mit der statischen Variable count kann die Anzahl der erzeugten Person-Objekte gezählt werden.

public class Person {

    private static int count;
    private String name;

    public Person(String name) {
        this.name = name;
        count++;
    }

    public String getName() { return name; }

    public static int getCount() { return count; }

    public static void main(String[] args) {
        Person p1 = new Person("Peter");
        Person p2 = new Person("Werner");
        System.out.println(getCount()); // Ausgabe: 2
    }
}

Das Schlüsselwort final kann sich auf Variablen, Methoden und Klassen beziehen.

  • Deklariert man eine Variable als final, muss der Variable genau einmal bei der Deklaration oder im Konstruktor ein Wert zugewiesen werden. Ein schreibender Zugriff auf die Variable ist nach der ersten Zuweisung nicht mehr möglich.
  • Deklariert man eine Methode als final, kann diese Methode nicht mehr mittels Vererbung überschrieben werden.
  • Deklariert man eine Klasse als final, kann von dieser Klasse keine weitere Klasse (extends) abgeleitet werden.

Eine Kombination von static und final ist sowohl bei Variablen als auch bei Methoden möglich. Die Kombination static final wird oft zur Deklaration globaler Konstanten verwendet:

public static final double PI = 3.141592653589793;

public static final Color BACKGROUND_COLOR = Color.LIGHT_GRAY;
Wann werden statische Methoden verwendet?

Statische Methoden können verwendet werden, ohne ein Objekt der Klasse, in der die Methode implementiert ist, erzeugen zu müssen. Sie werden oft für mathematische Funktionen und Utility-Klassen verwendet (Math.sin(), Arrays.sort(), System.out.println(), …).