Was bedeutet der Modifikator final?

Der Modifikator final hat Einfluss auf die Änderungsmöglichkeiten eines Elementes. Er kann auf Variablen, Methoden, Methodenparameter und Klassen angewendet werden.

final bei Variablen

Werden Variablen mit final gekennzeichnet, so sind sie nach der Initialisierung nicht mehr änderbar. Sie können jedoch als uninitialisierte, leere Variablen deklariert, müssen dann jedoch im Konstruktor initialisiert werden.

public class FinalBsp {
    final int i;
    final int j = 10;
	
    public FinalBsp() {
        i = 20;
        j = 15;	// Fehler
    }

    public static void main(String[] args) {
        FinalBsp fb = new FinalBsp();
        System.out.println(fb.i + fb.j);
    }
}

Der Modifikator final wird häufig verwendet, um Konstanten zu definieren. Sind diese unabhängig von der Objektbildung, so werden sie zusätzlich static deklariert. Man spricht dann von Klassenvariablen. Ihre Bezeichner werden in Großbuchstaben geschrieben. Z.B. ist die mathematische Konstante PI auf diese Weise in der Klasse java.lang.Math definiert.

final bei Methoden

Werden Methoden als final gekennzeichnet, so können sie in abgeleiteten Klassen nicht überschrieben werden.

public class FinalBsp {
public static void main(String[] args) {
        new LKW().fahren();
    }
}

class Auto {
    int tempo = 0;
    final void fahren() {
        tempo += 100;
    }
}

class LKW extends Auto {
    void fahren() {  // Fehler
        tempo += 20;
    }
}

final bei Methodenparametern

Bei Methodenparametern verhält es sich ähnlich wie bei Variablen. Werden sie final deklariert, so sind sie nach der Übergabe nicht mehr veränderbar. Dies bezieht sich bei Objekten jedoch nur auf die Referenz selbst. Ihr Zustand kann sehr wohl modifiziert werden wie das folgende Beispiel zeigt.

public class FinalBsp {
    public static void main(String[] args) {
        new Fuhrpark().fahren(new LKW());
    }
}

class Fuhrpark {
    void fahren(final LKW lkw) {
        lkw.tempo += 10;
        System.out.println(lkw.tempo);	// 10
    }
}

class LKW {
    int tempo = 0;
}

Der Methode fahren der Klasse Fuhrpark wird hier eine Referenz auf ein LKW-Objekt übergeben, deren Eigenschaft tempo verändert wird, obwohl die Objektreferenz selbst final deklariert wurde.

final bei Klassen

Wird eine Klasse mit final gekennzeichnet, kann von ihr keine Unterklasse abgeleitet werden. Tendenziell wird in einem solchen Fall somit die Objektorientierung unterlaufen. Es gibt dennoch Gründe die Erweiterung einer Klasse durch Markierung mit final zu unterbinden:

Wenn Ihnen javabeginners.de gefällt, freue ich mich über eine Spende an diese gemeinnützigen Organisationen.