Final
Während wir mit abstract das Erweitern einer Klasse geradezu erzwingen, können wir es durch das Schlüsselwort final verhindern. Von finalen Klassen darf nicht abgeleitet werden, eineKlasse
class MyString extends String { // FEHLER!!
}
wird man in Java nicht zum Leben erwecken können (resp. zum Kompilieren bringen). java.lang.String ist eine finale Klasse. Finale Klassen sollten zur Laufzeit etwas schneller geladen werden als nicht finale Klassen. Der Hauptgrund für ihre Verwendung dürfte aber sein, dass man die Implementierung gegen Veränderung schützen möchte.
Wenn eine Klasse final ist, heißt das nicht, dass ihre Felder nicht verändert werden können.
Methoden können ebenfalls final sein. In diesem Fall dürfen sie in abgeleiteten Klassen nicht überschrieben werden. Der Grund ist wie bei Klassen, dass man eine bestimmte Implementierung schützen will.
Am häufigsten finden wir das Schlüsselwort final bei Feldern (Variablen). Finale Felder dürfen nach der Definition nicht verändert werden!
final int i; // Deklaration
i=0; // Definition, aber ab jetzt darf i nicht verändert werden.
i++; // FEHLER!!
Final wird auch benutzt, um Konstanten zu definieren. In der Tat ist dies die einzige Möglichkeit, in Java Konstanten zu definieren. Echte Konstanten definiert man „public static final“ und benennt sie wie dargestellt mit Grossbuchstaben:
public static final String ERROR_MESSAGE="Es ist ein Fehler aufgetreten!";
Konstanten werden vom Compiler anders behandelt als Variablen, so dass man dem Compiler ruhig mitteilen sollte, wenn eine Variable nicht verändert wird.
Final kommt auch gelegentlich in der Methodensignatur vor:
public void doSomething(final int val) {...
zeigt an, dass die Variable „val“ in der Methode nur gelesen, aber nicht verändert wird.