When you declare a class as final, it can no longer be subclassed. Java has used this for security purposes with classes like String and Integer. It also allows the compiler to make some optimizations.
When you declare a method of a class as final, subclasses of the class cannot override the method.
When you declare a data field of a class as final, the value of that data field cannot be changed after it is initialized. Moreover, when you declare a final data field, you must assign a value in an initializer, as in:
final boolean ALWAYS_TRUE = true;
After this declaration, Any other attempt to assign a value to ALWAYS_TRUE would results in a compile-time error.