Das final-Schlüsselwort
Teil des Abschnitts Objektorientierte Programmierung der Java-Journey von Coddy — Lektion 13 von 87.
Das Schlüsselwort final in Java verhindert Modifikationen. Es kann auf Variablen, Methoden und Klassen angewendet werden, jeweils mit einer unterschiedlichen Wirkung.
Wenn es auf eine Variable angewendet wird, macht final sie zu einer Konstanten – einmal zugewiesen, kann ihr Wert nicht mehr geändert werden:
public class Circle {
private final double PI = 3.14159;
private final double radius;
public Circle(double radius) {
this.radius = radius; // Kann einmal im Konstruktor zugewiesen werden
}
public void setRadius(double r) {
// this.radius = r; // Fehler! Eine final-Variable kann nicht neu zugewiesen werden
}
}Eine final-Variable muss entweder bei der Deklaration oder im Konstruktor initialisiert werden. Danach führt jeder Versuch, sie neu zuzuweisen, zu einem Kompilierungsfehler.
Für Referenztypen bedeutet final, dass die Referenz nicht auf ein anderes Objekt zeigen kann, aber der Inhalt des Objekts sich dennoch ändern kann:
private final StringBuilder name = new StringBuilder("John");
// name = new StringBuilder("Jane"); // Fehler! Neuzuweisung nicht möglich
name.append(" Doe"); // OK! Objektinhalt kann sich ändernDie Verwendung von final bei Feldern kommuniziert die Absicht klar – sie signalisiert anderen Entwicklern, dass sich dieser Wert nach der Initialisierung niemals ändern sollte. Dies ist besonders nützlich für Konfigurationswerte, IDs oder alle Daten, die während der gesamten Lebensdauer eines Objekts konstant bleiben müssen.
Aufgabe
EinfachLassen Sie uns ein Student-Registrierungssystem erstellen, das das Schlüsselwort final verwendet, um Daten zu schützen, die sich nach der Registrierung eines Studenten niemals ändern sollten.
Sie werden zwei Dateien erstellen, um Ihren Code zu organisieren:
Student.java: Erstellen Sie eine Student-Klasse, in der bestimmte Informationen dauerhaft gesperrt sind, sobald sie festgelegt wurden:- Ein
finalFeldstudentId(String) - wird bei der Erstellung zugewiesen und kann sich nie ändern - Ein
finalFeldenrollmentYear(int) - das Jahr, in dem sich der Student eingeschrieben hat, ebenfalls dauerhaft - Ein reguläres privates Feld
name(String) - kann aktualisiert werden, wenn der Student seinen Namen ändert - Ein Konstruktor, der alle drei Werte entgegennimmt und die Felder initialisiert
- Ein Getter
getStudentId()für die Studenten-ID - Ein Getter
getEnrollmentYear()für das Einschreibungsjahr - Ein Getter
getName()und SettersetName()für den Namen - Eine Methode
getInfo(), die Folgendes zurückgibt:"ID: [studentId] | Name: [name] | Enrolled: [enrollmentYear]"
- Ein
Main.java: Erstellen Sie ein Student-Objekt, aktualisieren Sie dann dessen Namen und zeigen Sie die Informationen an. Sie erhalten vier Eingaben: die Studenten-ID, den ursprünglichen Namen, das Einschreibungsjahr und einen neuen Namen für die Aktualisierung. Geben Sie zwei Zeilen aus:- Die Studenten-Info vor der Namensänderung
- Die Studenten-Info nach der Namensänderung
Sie erhalten vier Eingaben in der folgenden Reihenfolge: studentId (String), name (String), enrollmentYear (int) und newName (String).
Beachten Sie, wie die final Felder die ID und das Einschreibungsjahr des Studenten schützen - dies sind dauerhafte Datensätze, die sich nicht ändern sollten, während der Name über seinen Setter aktualisiert werden kann.
Spickzettel
Das Schlüsselwort final verhindert Änderungen in Java. Es kann auf Variablen, Methoden und Klassen angewendet werden.
Wenn es auf eine Variable angewendet wird, macht final sie zu einer Konstante – einmal zugewiesen, kann ihr Wert nicht mehr geändert werden:
public class Circle {
private final double PI = 3.14159;
private final double radius;
public Circle(double radius) {
this.radius = radius; // Kann einmal im Konstruktor zugewiesen werden
}
public void setRadius(double r) {
// this.radius = r; // Fehler! Final-Variable kann nicht neu zugewiesen werden
}
}Eine final-Variable muss entweder bei der Deklaration oder im Konstruktor initialisiert werden. Danach führt jeder Versuch einer Neuzuweisung zu einem Kompilierfehler.
Bei Referenztypen bedeutet final, dass die Referenz nicht auf ein anderes Objekt zeigen kann, der Inhalt des Objekts sich jedoch weiterhin ändern kann:
private final StringBuilder name = new StringBuilder("John");
// name = new StringBuilder("Jane"); // Fehler! Kann nicht neu zugewiesen werden
name.append(" Doe"); // OK! Objektinhalt kann sich ändernDie Verwendung von final bei Feldern kommuniziert die Absicht – es zeigt an, dass sich ein Wert nach der Initialisierung niemals ändern sollte, was nützlich für Konfigurationswerte, IDs oder konstante Daten ist.
Probier es selbst
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// Eingaben lesen
String studentId = scanner.nextLine();
String name = scanner.nextLine();
int enrollmentYear = scanner.nextInt();
scanner.nextLine(); // Zeilenumbruch konsumieren
String newName = scanner.nextLine();
// TODO: Erstelle ein Student-Objekt mit den Anfangswerten
// TODO: Gib die Student-Informationen vor der Namensänderung aus
// TODO: Aktualisiere den Namen des Students mithilfe des Setters
// TODO: Gib die Student-Informationen nach der Namensänderung aus
}
}
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Objektorientierte Programmierung
1Grundlagen der OOP
Externe DateienEinführung in die OOPKlassen vs. ObjekteDas this-SchlüsselwortMethodenFelder (Attribute)Konstruktor-MethodeKonstruktor-ÜberladungRückblick – Einfacher Taschenrechner4Vererbung
Grundlagen der Vererbung (extends)Das super-SchlüsselwortMethoden überschreiben (@Override)Konstruktor-VerkettungDie Object-KlasseEinfache & mehrstufige VererbungWarum keine Mehrfachvererbung von KlassenZusammenfassung - Mitarbeiter-Hierarchie7Spezielle Methoden & Object-Klasse
toString()-Methodeequals() und hashCode()clone()-MethodecompareTo() und ComparableComparator-InterfaceZusammenfassung – Benutzerdefiniertes Sortieren2Zugriffsmodifikatoren & Kapselung
Überblick über ZugriffsebenenGetter- und Setter-MethodenInformation HidingDas final-SchlüsselwortRückblick – Bankkonto-Manager5Polymorphismus
Grundlagen der MethodenüberladungMethodenüberschreibung (Laufzeit)Upcasting und DowncastingDer instanceof-OperatorAbstrakte Klassen und MethodenZusammenfassung – Formenrechner8Fortgeschrittene OOP-Konzepte
Komposition vs. VererbungAggregation vs. KompositionInnere, geschachtelte & anonyme KlassenEnums und Enum-MethodenRecords (Java 16+)Sealed Classes (Java 17+)11Design Patterns Teil 1
Einführung in Design PatternsSingleton-PatternFactory-PatternBuilder-PatternObserver-PatternStrategy-Pattern14Abschlussherausforderungen
E-Learning-PlattformBanksystemSpielcharakter-EntwicklungFahrzeugvermietung3Klasseneigenschaften & Statische Member
Instanz- vs. statische VariablenStatische MethodenStatische BlöckeKonstanten (static final)Zusammenfassung – Zähler & Utility6Interfaces & Abstrakte Klassen
Einführung in InterfacesInterfaces implementierenImplementierung mehrerer InterfacesDefault- & statische Methoden in InterfacesAbstrakte Klassen vs. InterfacesFunktionale InterfacesZusammenfassung - Zahlungssystem