Als final können in Java-Programmen markiert werden:
Bedeutung in allen Fällen: Dieses Element kann nicht verändert werden.
Final kennzeichnet konstante Daten, also sowohl
final int MAX = 12;
also auch
final int RAND = (int)random*12;
final-Werte müssen bei ihrer Deklaration initialisiert werden:
// konstanter float-Wert: static final float PI = 3.14; // konstante Referenz: final Uhr u = new Uhr(14,50);
Ausnahme: Die in Java1.1 neuen Blanko-Konstanten (blank finals):
Konstanten, die für jede Instanz einer Klasse einen anderen Wert haben können. Jeder Konstruktor muß diesen Wert zuweisen:
class blankfinaltest { final int C; int val; blankfinaltest() { C = 7; } blankfinaltest(int v) // FALSCH { val = v; } }
Der Compiler:
Blank final variable 'C' may not have been initialized. It must be assigned a value in an initializer, or in every constructor.
Finale Methoden können von abgeleiteten Klassen nicht überschrieben werden:
class finalm { final void m() { System.out.println("fini"); } } class finalsub extends finalm { void m() // FALSCH { System.out.println("over"); } }
Der Compiler:
Final methods can't be overriden. Method void m() is final in class finalm.
Gründe für finale Methoden:
Insgesamt kann der Java-Compiler in folgenden Fällen dynamische Methodenbindung durch einen schnellen Direktaufruf ersetzen:
Darüberhinaus kann in diesen Fällen Inlining der Methodenrümpfe in Betracht gezogen werden.
Durch final-Kennzeichnung einer gesamten Klasse verbietet man die Erweiterung dieser Klasse:
final class finalc { void m() { System.out.println("fini"); } } class finalsub extends finalc // FALSCH { void m() { System.out.println("over"); } }
Der Compiler:
Can't subclass final classes: class finalc
Die Gründe für finale Klassen sind ebenfalls Sicherheit und/oder Effizienz.