Great question! The final
keyword in Java is small in size, but very powerful in meaning. It can be applied to:
✅ Variables
✅ Methods
✅ Classes
The significance of final
depends on where it’s used, so let me break it down.
📦 1️⃣ final
with Variables
final int MAX_VALUE = 100;
Meaning
✅ The value cannot be changed after initialization — it’s a constant.
✅ If you try to assign a new value to MAX_VALUE
, the compiler will throw an error.
For instance variables (fields):
class Car {
final String brand;
Car(String brand) {
this.brand = brand; // allowed to set once inside constructor
}
}
✅ You can set a final
field once, either at declaration or inside the constructor — but never after.
For local variables:
void process(final int count) {
// count cannot be changed inside this method
}
✅ final
method parameters cannot be reassigned inside the method.
🔒 2️⃣ final
with Methods
class Animal {
final void eat() {
System.out.println("Eating...");
}
}
Meaning
✅ Subclasses cannot override a final
method.
✅ This is useful when you want to protect critical behavior from being modified by child classes.
🚫 3️⃣ final
with Classes
final class MathUtils {
// code...
}
Meaning
✅ A final
class cannot be extended (no subclasses allowed).
✅ This is used when you want to prevent inheritance, usually for:
- Utility classes (like
java.lang.Math
) - Security-sensitive classes
🚀 Summary Table
Usage | Meaning | Example |
---|---|---|
final variable | Value cannot change | final int MAX = 100; |
final method | Cannot be overridden | final void process() |
final class | Cannot be subclassed | final class UtilityClass |
🔥 Why is final
important?
✅ Safety — Prevent accidental overrides and modification.
✅ Performance Hint — In some cases, the JVM can optimize final
methods better because it knows they won’t change.
✅ Design Intent — Makes your intent clear to other developers (This should never be changed/extended).
⚠️ Important Note
final
does not make objects immutable — only the reference itself is fixed.- Example:
final List<String> list = new ArrayList<>();
list.add("Hello"); // ✅ allowed
list = new LinkedList<>(); // ❌ not allowed (reference cannot change)