Das Keyword final wird in Java ein­ge­setzt, um Elemente zu de­fi­nie­ren, die nach der Er­stel­lung nicht mehr verändert werden können. Diesen Mo­di­fi­ka­tor kannst du auf Klassen, Methoden und Variablen anwenden. Er hilft dir dabei, Fehler zu vermeiden und un­ge­woll­te Än­de­run­gen im Code zu un­ter­bin­den.

Was bedeutet Java final?

Die meisten Pro­gram­mier­spra­chen erlauben es, be­stehen­den Code flexibel an­zu­pas­sen und aus­zu­bau­en. Das funk­tio­niert auch in Java, doch in manchen Fällen ist es wichtig, dass ein Element als un­ver­än­der­lich fest­ge­legt wird. Hier kommt der Mo­di­fi­ka­tor final ins Spiel. Mit ihm schränkst du den Zugriff auf Klassen, Methoden oder Variablen gezielt ein. Einmal zu­ge­wie­se­ne Werte einer finalen Variable bleiben fix, finale Klassen lassen sich nicht erweitern und finale Methoden können nicht über­schrie­ben werden. So sorgst du für Sta­bi­li­tät und Si­cher­heit in deinem Code.

Finale Klassen

Wenn du Java final für eine Klasse ver­wen­dest, ist eine Er­wei­te­rung dieser Klasse aus­ge­schlos­sen. Das ist eine gängige Praxis, um zu ver­hin­dern, dass Un­ter­klas­sen ab­ge­lei­tet werden. Ein klas­si­sches Beispiel sind Basis-Da­ten­ty­pen wie java.lang.Math oder java.lang.String, die stets als final de­kla­riert sind. Auch wenn du aus ar­chi­tek­to­ni­schen Gründen keine Ab­lei­tun­gen zulassen möchtest, ist final die richtige Wahl. Im nächsten Beispiel siehst du eine finale Klasse sowie den Versuch einer Er­wei­te­rung durch eine zweite Klasse, gefolgt von der main-Methode.

final class FinaleKlasse {
	public void beispielmethode() {
		System.out.println("Dies ist eine Methode innerhalb der final-Klasse.");
	}
}
class WeitereKlasse extends FinaleKlasse {
	public void beispielmethode() {
		System.out.println("Die Methode ist nun auch in der weiteren Klasse.");
	}
}
public class Main {
	public static void main(String[] args) {
		WeitereKlasse unsereWeitereKlasse = new WeitereKlasse();
		unsereWeitereKlasse.beispielmethode();
	}
}
java

Die Feh­ler­mel­dung, die du in diesem Fall erhältst, sieht etwa so aus:

Main.java:6: error: cannot inherit from final FinaleKlasse
class WeitereKlasse extends FinaleKlasse
       ^
1 error
java

Finale Methoden

Markierst du eine Methode als final, kann sie in Un­ter­klas­sen nicht über­schrie­ben werden. Das ist nützlich, um si­cher­zu­stel­len, dass die Logik einer Methode kon­sis­tent bleibt und nicht ver­se­hent­lich verändert wird. Wir erstellen dazu eine Klasse „Kaiser“ mit der finalen Methode „meinTitel“. Eine weitere Klasse „Koenig“ versucht nun, diese Methode zu über­schrei­ben, während wir in der main-Methode ebenfalls darauf zugreifen wollen. Der Code dazu:

public class Kaiser {
	public final void meinTitel() {
		System.out.println("Ich bin der Kaiser.");
	}
}
public class Koenig extends Kaiser {
	public final void meinTitel() {
		System.out.println("Ich bin der Koenig.");
	}
}
public class Prinz {
	public static void main(String[] args) {
		Koenig meinTitel = new Koenig();
		Koenig.meinTitel();
	}
}
java

Beim Ausführen dieses Codes wird dir folgende Feh­ler­mel­dung angezeigt:

Main.java:9: error meinTitel() in Koenig cannot override meinTitel() in Kaiser public final void meinTitel() {
		^
overriden method is final
java

Finale Variablen

Mit Java final erstellst du Variablen, deren Wert nach­träg­lich nicht mehr änderbar ist. Das ist besonders bei Kon­stan­ten wichtig, die im gesamten Pro­gramm­ver­lauf gleich bleiben müssen. Im folgenden Beispiel de­fi­nie­ren wir eine Variable x mit dem Wert 5 und versuchen danach, ihr einen neuen Wert zu­zu­wei­sen. So sieht der Code aus:

public class Main {
	final int x = 5;
public static void main(String[] args) {
	Main neuerWert = new Main();
	neuerWert.x = 10;
	System.out.println(neuerWert.x);
	}
}
java

Nutzt du nun den Java-Befehl System.out.println für die Ausgabe, erscheint diese Feh­ler­mel­dung:

Main.java:6: error: cannt assign a value to final variable x
	neuerWert.x = 10;
		     ^
1 error
java

Leere final-Variablen nutzen

Nor­ma­ler­wei­se müssen Variablen in Java direkt in­itia­li­siert werden. De­kla­rierst du jedoch eine leere final-Variable, kannst du diese über einen Klas­sen­kon­struk­tor befüllen. Hier ein Beispiel dazu:

public class Beispiel {
	final String beispieltext;
	Beispiel() {
		beispieltext = "Hier steht Ihre Nachricht.";
	}
	public static void main(String[] args) {
		Beispiel neuesObjekt = new Beispiel();
		System.out.println(neuesObjekt.beispieltext);
	}
}
java

Führst du diesen Code aus, wird dir dieser Satz aus­ge­ge­ben:

Hier steht Ihre Nachricht.
java
Zum Hauptmenü