Unsere Datenschutzrichtlinie wird in Kürze aktualisiert. Bitte sehen Sie sich die Vorschau an.

Java 7 Grundkurs

Das Schlüsselwort "final"

Testen Sie unsere 2021 Kurse

10 Tage kostenlos!

Jetzt testen Alle Abonnements anzeigen
Das Schlüsselwort "final" kann an vier verschiedenen Stellen in einer Klasse benutzt werden und hat jeweils geringfügig unterschiedliche Bedeutungen. Diese lernen Sie hier kennen.
08:22

Transkript

In diesem Video zeige ich Ihnen, was Sie mit dem Schlüsselwort "Final" machen können. "Final" kann in einer Klasse an vier verschiedenen Stellen stehen. Dort hat es dann jeweils eine geringfügig unterschiedliche Bedeutung. Gehen wir diese Stellen einmal der Reihe nach durch. Ich benutze dazu diese kleine Demonstrationsklasse "FinalDemo" aus dem Projekt "Demos". Das ist eine typische Java-Klasse, wie man sie z.B. in Tutorials, in Vorlesungen oder in Video-Trainings finden kann. Die Klasse "FinalDemo" hat ein Attribut, das heißt "Ein Attribut" und ist vom Typ Int. Zum Erzeugen eines Exemplars dieser Klasse steht ein Konstruktor zur Verfügung und der nimmt einen Initialisierungswert für dieses Attribut und setzt das Attribut dann entsprechend. Außerdem hat diese Klasse noch eine Methode, die heißt "Eine Methode", nimmt keine Parameter und gibt auch nichts zurück, und sie enthält eine lokale Variable namens "lokale Variable". Diese Punkte hier sollen andeuten, dass die Methode eventuell noch weitere Dinge enthält, die vielleicht sogar etwas mit dieser lokalen Variablen tun. Wir könnten hier beispielsweise diese lokale Variable mit einem Wert belegen und wir könnten sie danach vielleicht auch noch hochzählen. Alles sehr typische Situationen für eine lokale Variable. Nun setzen wir hier einmal unser Schlüsselwort "Final" ein. "Final" bedeutet "fertig, abgeschlossen, beendet" und wenn ich vor diese Variable ein Final davor setze, dann mache ich damit daraus eine konstante Variable. Das bedeutet, einmal darf ich ihr einen Wert zuweisen, das muss auch nicht zwangsläufig hier bei der Deklaration sein, aber wenn sie einmal einen Wert bekommen hat, dann bleibt sie konstant. Dann kann ich diesen Wert nicht mehr ändern. Also, von der Sache her eine Konstante. Die Auswirkungen können wir hier recht gut beobachten. Die Zuweisung funktioniert noch problemlos, wenn ich danach aber versuche, diese Variable hochzuzählen, dann versuche ich ja letztlich ihren Wert zu ändern. Da es aber eine Konstante ist, bekomme ich hier, richtig, einen Compiler-Fehler. Wenn Sie sich also angewöhnen, alle lokalen Variablen, die ihren Wert nicht mehr ändern können sollen, als "Final" zu deklarieren, dann kann Ihnen der Compiler dabei helfen, Verstöße dagegen sofort aufzudecken. Ein korrektes Programm würde auch ohne "Final" genau so funktionieren. Aber mit "Final" kann der Compiler absichern, dass das Programm diesbezüglich korrekt ist. Kommentieren wir diese Zeile am besten einfach einmal aus, damit diese hässliche Kringellinie verschwindet. Strg+Shift+C macht das für mich. Kommen wir zur zweiten Stelle, an der wir "Final" einsetzen können, nämlich vor eine Methode. So wie ich bei der lokalen Variablen das "Final" vor den Typ geschrieben habe, muss ich es auch bei der Methodendeklaration vor den Rückgabetyp setzen. "Final" vor einer Methode bedeutet, dass diese Methode fertig, abgeschlossen, beendet ist, und es hat für diese Methode selbst erstmal überhaupt keine Auswirkung. Der Effekt entsteht erst, wenn jemand versucht, eine Unterklasse dieser Klasse "FinalDemo" zu erzeugen, und diese Methode "Eine Methode" zu überschreiben. Das Überschreiben von Methoden ist ein gängiger Weg, um geerbtes Verhalten anzupassen und zu verändern. Nun kann es aber Situationen geben, in denen der Entwickler dieser Methode hier absichern möchte, dass daran nichts mehr gedreht wird, dass das, was da hineinimplementiert wurde, auch in allen Unterklassen genau so erhalten bleibt. Unterklassen können diese Methode dann zwar benutzen, sie können sie aber nicht mehr verändern. Auch hier ermöglicht es dieses Schlüsselwort dem Compiler wieder, dafür zu sorgen, dass die Intention des Entwicklers auch tatsächlich berücksichtigt wird. Kommen wir zur dritten von den vier Stellen: Das "Attribut". Auch hier kann ich "Final" davor schreiben. Ein "Final" Attribut darf einmal mit einem Wert belegt werden und danach kann es nicht mehr geändert werden. Das ist also erstmal ziemlich genau so, wie bei einer lokalen Variablen auch. Und wie bei einer lokalen Variablen, muss ich dem Attribut nicht sofort einen Wert zuweisen, sondern ich kann das auf später verschieben. Bei der lokalen Variablen habe ich das hier unten gemacht. Da ist es eigentlich mir überlassen, wann ich es mache, Hauptsache, bevor ich die Variable das erste Mal benutze, und wenn ich sie gar nicht benutze, dann muss ich ihr auch keinen Wert zuweisen. Das ist jetzt beim Attribut anders. Eine lokale Variable existiert ja nur so lange, wie die Ausführung dieser Methode dauert. Ein Attribut hingegen lebt so lange wie das Objekt, zu dem es gehört. Es könnte also in allen Methoden dieser Klasse verwendet werden. Deshalb muss abgesichert sein, dass bei einem fertigen Objekt, noch bevor der erste Methodenaufruf stattfindet, dieses "Final" Attribut auch tatsächlich einen Wert bekommen hat, damit dann alle Methoden beruhigt dieses Attribut lesen können. Schreiben können sie es ja nicht mehr, es hat ja schon einen Wert. Damit gibt es nur zwei Stellen, an denen wir das Attribut initialisieren können: Entweder wir schreiben hier direkt einen Wert dahinter, so, oder wir initialisieren es im Konstruktor. Die Initialisierung im Konstruktor bringt uns etwas mehr Flexibilität. Wir können auf diese Weise nämlich mehrere verschiedene Exemplare dieser Klasse "Final Demo" anlegen und jedes einzelne Exemplar kann einen anderen Wert für dieses Attribut haben. Aber bei allen Exemplaren ist der Wert fest. Und einmal gesetzt, kann er nicht mehr geändert werden, denn es steht ja "Final" davor. Ich könnte also auch nicht in irgendeiner Methode dieses Attribut mit einem neuen Wert belegen. Dann bekomme ich, genau, einen Compiler-Fehler. Also nehmen wir diese Zeilen hier unten ganz schnell wieder weg, Strg+E für Erase, und die Zeile ist weg. Wann braucht man solch ein Attribut, das man zwar einmal mit einem Wert belegen kann und dann aber nicht mehr? Ein Beispiel dafür wäre eine Klasse "Auto" und dieses Attribut hier könnte die Höchstgeschwindigkeit des Fahrzeugs sein. Ich zeige das mal, wie das dann aussähe. Ich benenne diese Variable einmal um mit Strg+R für Rename, also "Höchstgeschwindigkeit". Der Parameter soll jetzt natürlich nicht mehr "A" heißen, sondern auch einen entsprechenden Namen haben, z.B. auch wieder Strg+R. Nennen wir es "VMax". Das heißt, wir können jetzt verschiedene Instanzen dieser Klasse erzeugen, verschiedene Exemplare bauen. Jedes bekommt im Konstruktor eine andere Höchstgeschwindigkeit übergeben, und diese Höchstgeschwindigkeit ist dann aber für das jeweilige Fahrzeug fest. Kommen wir zur vierten und letzten Stelle, an der wir das Schlüsselwort "Final" verwenden können, und zwar vor der Klasse. Ich kann hier schreiben "public final class FinalDemo". Das bedeutet nun, dass die Klasse fertig, abgeschlossen, beendet ist. Und auch hier wirkt sich das aus, wenn wir versuchen Vererbung ins Spiel zu bringen. Final vor einer Klasse bedeutet nämlich, dass ich von dieser Klasse keine Unterklassen erzeugen kann. Und versuche ich es trotzdem, bekomme ich einen Compiler-Fehler. Mit einem "Final" einer Klassendeklaration, zeigt der Entwickler dieser Klasse also allen anderen Entwicklern, dass diese Klasse nicht dafür gedacht ist, als Basisklasse für weitere Klassen zu dienen. Sie ist in sich abgeschlossen, sie funktioniert, sie kann und soll aber nicht erweitert werden. Ein Beispiel für eine solche Klasse ist die Klasse "String" aus der Standardbibliothek. Wenn wir in die apidoc reinschauen, dann sehen wir, dass das da sogar drinsteht. Hier, Klasse String. Und hier steht public final class String. Jetzt versuche ich trotzdem mal diese Klasse als Basisklasse zu verwenden, indem ich meine Klasse "FinalDemo" als Unterklasse von String deklariere. Sie sehen, Compiler-Fehler "Kann nicht erben von String". Ich nehme das gleich einmal wieder weg. Einer der Gründe, warum man so etwas machen möchte, also eine Klasse als "Final" deklarieren, ist folgender: Eine Methode, die einen Parameter nimmt, z.B. vom Typ String, kann ich ja nun aufrufen, indem ich String-Objekte übergebe. Aber, wenn es möglich wäre, von String Unterklassen zu bauen, dann könnte ich mir ja auch eine Unterklasse bauen, könnte davon ein Exemplar erzeugen und dieses an diese Methode hier übergeben. Das würde ja dann auch funktionieren. In dieser hypothetischen Unterklasse von String, könnte ich nun alle möglichen Methoden überschreiben, die in der Klasse so drin sind und könnte das Verhalten der Klasse fundamental verändern. Und eine Methode, die eigentlich einfach nur ein String haben wollte, bekommt hier möglicherweise etwas völlig anderes. Da die Klasse String nun aber essentiell für das Verhalten der meisten Java-Anwendungen ist, wurde sie als "Final" deklariert, um genau so etwas zu verhindern. Damit kennen Sie nun die verschiedenen Einsatzmöglichkeiten des Schlüsselwortes "Final", und Sie haben gesehen, wie es den Compiler bei seiner Arbeit unterstützen kann, für fehlerfreie Programme zu sorgen.

Java 7 Grundkurs

Machen Sie sich mit den Grundlagen der Java-Programmierung vertraut und lernen Sie die Syntax der Sprache sowie das Konzept der objektorientierten Softwareentwicklung kennen.

8 Std. 32 min (66 Videos)
Derzeit sind keine Feedbacks vorhanden...
 

Dieser Online-Kurs ist als Download und als Streaming-Video verfügbar. Die gute Nachricht: Sie müssen sich nicht entscheiden - sobald Sie das Training erwerben, erhalten Sie Zugang zu beiden Optionen!

Der Download ermöglicht Ihnen die Offline-Nutzung des Trainings und bietet die Vorteile einer benutzerfreundlichen Abspielumgebung. Wenn Sie an verschiedenen Computern arbeiten, oder nicht den ganzen Kurs auf einmal herunterladen möchten, loggen Sie sich auf dieser Seite ein, um alle Videos des Trainings als Streaming-Video anzusehen.

Wir hoffen, dass Sie viel Freude und Erfolg mit diesem Video-Training haben werden. Falls Sie irgendwelche Fragen haben, zögern Sie nicht uns zu kontaktieren!