Skip to content

Final classes and methods

The final keyword can be applied to classes and methods to restrict inheritance and overriding.

A final class cannot be extended (subclassed).

final class ImmutableClass {
// ...
}
// class Child extends ImmutableClass { } // error

Use cases: Immutability (e.g., String, Integer), security, or design where inheritance would break invariants.

A final method cannot be overridden by subclasses.

class Parent {
final void cannotOverride() {
System.out.println("This method is final");
}
}
class Child extends Parent {
// void cannotOverride() { } // error
}

Use cases: Preventing modification of critical behavior, performance (early binding), or ensuring correctness of algorithms.

ModifierCan be extended?Can be overridden?
final classNoN/A
non‑final classYes
final methodNo
non‑final methodYes

Note: final does not affect static methods (they are hidden, not overridden). Also, final methods can be overloaded (different parameters) – that’s allowed.