Java final: So legst du Klassen, Methoden und Variablen fest
Das Keyword final wird in Java eingesetzt, um Elemente zu definieren, die nach der Erstellung nicht mehr verändert werden können. Diesen Modifikator kannst du auf Klassen, Methoden und Variablen anwenden. Er hilft dir dabei, Fehler zu vermeiden und ungewollte Änderungen im Code zu unterbinden.
Was bedeutet Java final?
Die meisten Programmiersprachen erlauben es, bestehenden Code flexibel anzupassen und auszubauen. Das funktioniert auch in Java, doch in manchen Fällen ist es wichtig, dass ein Element als unveränderlich festgelegt wird. Hier kommt der Modifikator final ins Spiel. Mit ihm schränkst du den Zugriff auf Klassen, Methoden oder Variablen gezielt ein. Einmal zugewiesene Werte einer finalen Variable bleiben fix, finale Klassen lassen sich nicht erweitern und finale Methoden können nicht überschrieben werden. So sorgst du für Stabilität und Sicherheit in deinem Code.
Finale Klassen
Wenn du Java final für eine Klasse verwendest, ist eine Erweiterung dieser Klasse ausgeschlossen. Das ist eine gängige Praxis, um zu verhindern, dass Unterklassen abgeleitet werden. Ein klassisches Beispiel sind Basis-Datentypen wie java.lang.Math oder java.lang.String, die stets als final deklariert sind. Auch wenn du aus architektonischen Gründen keine Ableitungen zulassen möchtest, ist final die richtige Wahl. Im nächsten Beispiel siehst du eine finale Klasse sowie den Versuch einer Erweiterung 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();
}
}javaDie Fehlermeldung, 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 errorjavaFinale Methoden
Markierst du eine Methode als final, kann sie in Unterklassen nicht überschrieben werden. Das ist nützlich, um sicherzustellen, dass die Logik einer Methode konsistent bleibt und nicht versehentlich verändert wird. Wir erstellen dazu eine Klasse „Kaiser“ mit der finalen Methode „meinTitel“. Eine weitere Klasse „Koenig“ versucht nun, diese Methode zu überschreiben, 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();
}
}javaBeim Ausführen dieses Codes wird dir folgende Fehlermeldung angezeigt:
Main.java:9: error meinTitel() in Koenig cannot override meinTitel() in Kaiser public final void meinTitel() {
^
overriden method is finaljavaFinale Variablen
Mit Java final erstellst du Variablen, deren Wert nachträglich nicht mehr änderbar ist. Das ist besonders bei Konstanten wichtig, die im gesamten Programmverlauf gleich bleiben müssen. Im folgenden Beispiel definieren wir eine Variable x mit dem Wert 5 und versuchen danach, ihr einen neuen Wert zuzuweisen. 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);
}
}javaNutzt du nun den Java-Befehl System.out.println für die Ausgabe, erscheint diese Fehlermeldung:
Main.java:6: error: cannt assign a value to final variable x
neuerWert.x = 10;
^
1 errorjavaLeere final-Variablen nutzen
Normalerweise müssen Variablen in Java direkt initialisiert werden. Deklarierst du jedoch eine leere final-Variable, kannst du diese über einen Klassenkonstruktor 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);
}
}javaFührst du diesen Code aus, wird dir dieser Satz ausgegeben:
Hier steht Ihre Nachricht.java