Menu
CoddyTech

Das Schlüsselwort final

Teil des Abschnitts Objektorientierte Programmierung der Java-Journey von Coddy. Lektion 13 von 87.

Das Schlüsselwort final verhindert in Java Änderungen. Es kann auf Variablen, Methoden und Klassen angewendet werden, jeweils mit einer anderen Wirkung.

Auf eine Variable angewendet, macht final sie zu einer Konstante – nach der Zuweisung kann sich ihr Wert nicht mehr ändern:

public class Circle {
    private final double PI = 3.14159;
    private final double radius;
    
    public Circle(double radius) {
        this.radius = radius;  // Kann im Konstruktor einmal zugewiesen werden
    }
    
    public void setRadius(double r) {
        // this.radius = r;  // Fehler! Eine final-Variable kann nicht erneut zugewiesen werden
    }
}

Eine final-Variable muss entweder bei der Deklaration oder im Konstruktor initialisiert werden. Danach führt jeder Versuch, ihr einen neuen Wert zuzuweisen, zu einem Kompilierungsfehler.

Bei Referenztypen bedeutet final, dass die Referenz nicht auf ein anderes Objekt zeigen kann, sich der Inhalt des Objekts aber weiterhin ändern kann:

private final StringBuilder name = new StringBuilder("John");

// name = new StringBuilder("Jane");  // Fehler! Neuzuweisung nicht möglich
name.append(" Doe");  // OK! Der Inhalt des Objekts kann sich ändern

Die Verwendung von final mit Feldern macht die Absicht klar – sie teilt anderen Entwicklern mit, dass sich dieser Wert nach der Initialisierung niemals ändern sollte. Das ist besonders nützlich für Konfigurationswerte, IDs oder Daten, die während der gesamten Lebensdauer eines Objekts konstant bleiben müssen.

Eine final-Methode kann in einer Unterklasse nicht überschrieben werden:

class Base {
    public final void greet() {
        System.out.println("Hi");
    }
}
class Child extends Base {
    // public void greet() { }  // Fehler! greet() ist final in Base
}

Eine final Klasse kann überhaupt nicht erweitert werden. String ist eine finale Klasse, daher kann keine Klasse von ihr erben:

final class Config { }
// class MyConfig extends Config { }  // Fehler! Config ist final
challenge icon

Aufgabe

Einfach

Erstellen wir ein Student-Registrierungssystem, das das Schlüsselwort final verwendet, um Daten zu schützen, die sich nach der Registrierung eines Studierenden niemals ändern sollen.

Du erstellst zwei Dateien, um deinen Code zu organisieren:

  • Student.java: Erstelle eine Student-Klasse, in der bestimmte Informationen nach dem Festlegen dauerhaft unveränderlich sind:
    • Ein final-Feld studentId (String) – wird bei der Erstellung zugewiesen und kann sich niemals ändern
    • Ein final-Feld enrollmentYear (int) – das Jahr, in dem sich der Studierende eingeschrieben hat, ebenfalls dauerhaft unveränderlich
    • Ein reguläres privates Feld name (String) – kann aktualisiert werden, wenn der Studierende seinen Namen ändert
    • Ein Konstruktor, der alle drei Werte entgegennimmt und die Felder initialisiert
    • Ein Getter getStudentId() für die Studierenden-ID
    • Ein Getter getEnrollmentYear() für das Einschreibungsjahr
    • Ein Getter getName() und ein Setter setName() für den Namen
    • Eine Methode getInfo(), die Folgendes zurückgibt: "ID: [studentId] | Name: [name] | Enrolled: [enrollmentYear]"
  • Main.java: Erstelle ein Student-Objekt, aktualisiere anschließend den Namen und gib die Informationen aus. Du erhältst vier Eingaben: die Studierenden-ID, den ursprünglichen Namen, das Einschreibungsjahr und einen neuen Namen, auf den der Name aktualisiert werden soll. Gib zwei Zeilen aus:
    • Die Informationen zum Studierenden vor der Namensänderung
    • Die Informationen zum Studierenden nach der Namensänderung

Du erhältst der Reihe nach vier Eingaben: studentId (String), name (String), enrollmentYear (int) und newName (String).

Beachte, wie die final-Felder die Studierenden-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 einlesen
        String studentId = scanner.nextLine();
        String name = scanner.nextLine();
        int enrollmentYear = scanner.nextInt();
        scanner.nextLine(); // Zeilenumbruch einlesen
        String newName = scanner.nextLine();
        
        // TODO: Ein Student-Objekt mit den Anfangswerten erstellen
        
        // TODO: Die Informationen zum Studenten vor der Namensänderung ausgeben
        
        // TODO: Den Namen des Studenten mit dem Setter aktualisieren
        
        // TODO: Die Informationen zum Studenten nach der Namensänderung ausgeben
    }
}
quiz iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Objektorientierte Programmierung

Übe selbstständig: Online-Java-Compiler