Was bedeutet der Modifikator final
?
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:
- Die Kennzeichnung mit
final
kann eine Warnung an nachfolgende Entwickler sein, die besagt, dass das Klassenkonzept - aus welchen Gründen auch immer - nicht für die Ableitung einer Unterklasse geeignet ist. - Der Typ der Klasse kann einen Basis-Datentyp darstellen, dessen
Erweiterung nicht sinnvoll ist. So sind z.B. die beiden Klassen
java.lang.Math
undjava.lang.String final
deklariert.
Wenn Ihnen javabeginners.de gefällt, freue ich mich über eine Spende an diese gemeinnützigen Organisationen.