Firstly, the part about variables being "overridden" - final
has two very different meanings. For classes and methods, it's about inheritance; for variables it's about being read-only.
There's one important "feature" of final local variables: they can be used in local (typically anonymous) inner classes. Non-final local variables can't be. That's the primary use of final
for local variables, in my experience.
public void foo() {
final String x = "hello";
String y = "there";
Runnable runnable = new Runnable() {
@Override public void run() {
System.out.println(x); // This is valid
System.out.println(y); // This is not
}
};
runnable.run();
}
Note that as a matter of style, some people like to use final
even when they're not capturing the variable in a local inner class. I'd certainly be comfortable with final
being the default, but a different modifier for "non-final", but I find that adding the modifier explicitly everywhere is too distracting.