Das Schlüsselwort final
Teil des Abschnitts Objektorientierte Programmierung der Java-Journey von Coddy. Lektion 13 von 87.
Das Schlüsselwort final in Java verhindert Änderungen. Es kann auf Variablen, Methoden und Klassen angewendet werden, wobei jede Anwendung eine andere Auswirkung hat.
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! Eine final-Variable kann nicht neu zugewiesen werden
}
}Eine final Variable muss entweder bei der Deklaration oder im Konstruktor initialisiert werden. Danach verursacht jeder Versuch, sie neu zuzuweisen, einen Kompilierungsfehler.
Für Referenztypen bedeutet final, dass die Referenz nicht auf ein anderes Objekt zeigen kann, aber der Inhalt des Objekts kann sich dennoch ändern:
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
EinfachErstellen wir ein Student-Registrierungssystem, das das Schlüsselwort final verwendet, um Daten zu schützen, die sich nach der Registrierung eines Studenten niemals ändern sollten.
Du erstellst zwei Dateien, um deinen Code zu organisieren:
Student.java: Erstelle eine Student-Klasse, in der bestimmte Informationen dauerhaft gesperrt werden, sobald sie festgelegt sind:- Ein
final-FeldstudentId(String) – wird bei der Erstellung zugewiesen und kann sich niemals ändern - Ein
final-FeldenrollmentYear(int) – das Jahr, in dem der Student sich 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 ein SettersetName()für den Namen - Eine Methode
getInfo(), die Folgendes zurückgibt:"ID: [studentId] | Name: [name] | Enrolled: [enrollmentYear]"
- Ein
Main.java: Erstelle ein Student-Objekt, aktualisiere anschließend seinen Namen und gib seine Informationen aus. Du erhältst vier Eingaben: die Studenten-ID, den ursprünglichen Namen, das Einschreibungsjahr und einen neuen Namen, auf den der Name aktualisiert werden soll. Gib zwei Zeilen aus:- Die Studenteninformationen vor der Namensänderung
- Die Studenteninformationen nach der Namensänderung
Du erhältst vier Eingaben in dieser Reihenfolge: studentId (String), name (String), enrollmentYear (int) und newName (String).
Beachte, wie die final-Felder die Studenten-ID und das Einschreibungsjahr schützen – dies sind dauerhafte Datensätze, die sich nicht ändern sollten, während der Name über seinen Setter aktualisiert werden kann.
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 Initialwerten
// TODO: Gib die Informationen des Studenten vor der Namensänderung aus
// TODO: Aktualisiere den Namen des Studenten mithilfe des Setters
// TODO: Gib die Informationen des Studenten 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 Schlüsselwort thisMethodenFelder (Attribute)KonstruktormethodeÜberladen von KonstruktorenRückblick – Einfacher Taschenrechner4Vererbung
Grundlegende Vererbung (extends)Das Schlüsselwort superÜberschreiben von Methoden (@Override)KonstruktorverkettungDie Object-KlasseEinfach- und mehrstufige VererbungWarum keine Mehrfachvererbung von KlassenRückblick – Mitarbeiterhierarchie7Spezielle Methoden & Object-Klasse
toString()-Methodeequals() und hashCode()clone()-MethodecompareTo() und ComparableComparator-SchnittstelleRückblick – Benutzerdefinierte Sortierung2Zugriffsmodifikatoren & Kapselung
Übersicht der ZugriffsebenenGetter- und Setter-MethodenInformationsverbergungDas Schlüsselwort finalRückblick – Bankkontoverwaltung5Polymorphismus
Grundlagen der MethodenüberladungMethodenüberschreibung (Laufzeit)Upcasting und DowncastingDer instanceof-OperatorAbstrakte Klassen und MethodenRückblick – Formrechner8Fortgeschrittene OOP-Konzepte
Komposition vs. VererbungAggregation vs. KompositionInnere, verschachtelte & anonyme KlassenEnums und Enum-MethodenRecords (Java 16+)Versiegelte Klassen (Java 17+)11Entwurfsmuster Teil 1
Einführung in EntwurfsmusterSingleton-MusterFactory-MusterBuilder-MusterObserver-MusterStrategie-Muster14Abschließende Herausforderungen
E-Learning-PlattformBankingsystemEntwicklung einer SpielfigurFahrzeugvermietungsdienst3Klassen-Props & statische Member
Instanz- vs. statische VariablenStatische MethodenStatische BlöckeKonstanten (static final)Wiederholung – Counter & Utility6Schnittstellen & abstrakte Klassen
Einführung in InterfacesInterfaces implementierenMehrere Interfaces implementierenDefault & Static in InterfacesAbstrakte Klassen vs. InterfacesFunktionale InterfacesRückblick – ZahlungssystemÜbe selbstständig: Online-Java-Compiler