En este tutorial aprenderemos el uso de la palabra clave final. La palabra clave final puede ser utilizada junto con las variables, métodos y clases. Cubriremos los siguientes temas en detalle.
1) variable final
2) método final
3) clase final
1) variable final
las variables finales no son más que constantes. No podemos cambiar el valor de una variable final una vez que se ha inicializado. Echemos un vistazo al siguiente código:
class Demo{ final int MAX_VALUE=99; void myMethod(){ MAX_VALUE=101; } public static void main(String args[]){ Demo obj=new Demo(); obj.myMethod(); } }
Salida:
Excepción en el hilo "principal" java.lang.Error: Problema de compilación no resuelto: El campo final Demo.MAX_VALUE no puede asignarse en beginnersbook.com.Demo.myMethod(Details.java:6) en beginnersbook.com.Demo.main(Details.java:10)
Obtuvimos un error de compilación en el programa anterior porque intentamos cambiar el valor de una variable final «MAX_VALUE».
Nota: Se considera una buena práctica tener nombres de constantes en MAYÚSCULAS (MAYÚSCULAS).
Variable final en blanco
Una variable final que no está inicializada en el momento de la declaración se conoce como variable final en blanco. Debemos inicializar la variable final en blanco en el constructor de la clase, de lo contrario, arrojará un error de compilación (Error: la variable MAX_VALUE podría no estar inicializada).
Así es como se utiliza una variable final en blanco en una clase:
class Demo{ //Blank final variable final int MAX_VALUE; Demo(){ //Se debe inicializar en el constructor MAX_VALUE=100; } void myMethod(){ System.out.println(MAX_VALUE); } public static void main(String args[]){ Demo obj=new Demo(); obj.myMethod(); } }
Salida:
100
¿Cuáles el uso de la variable final en blanco?
Digamos que tenemos una clase de estudiantes que tiene un campo llamado Roll No. Como el Roll No no debe cambiarse una vez que el estudiante está registrado, podemos declararlo como una variable final en una clase pero no podemos inicializar el roll no por adelantado para todos los estudiantes (de lo contrario todos los estudiantes tendrían el mismo roll no). En tal caso podemos declarar como final del rollo no una variable y la inicializamos durante la creación del objeto de esta manera:
class StudentData{ //Blank final variable final int ROLL_NO; StudentData(int rnum){ //Se debe inicializar en el constructor ROLL_NO=rnum; } void myMethod(){ System.out.println("Roll no is:"+ROLL_NO); } public static void main(String args[]){ StudentData obj=new StudentData(1234); obj.myMethod(); } }
Salida:
Rollo no es:1234
Más sobre la variable final en blanco en StackOverflow y Wiki.
Variable final estática no inicializada
Una variable final estática que no se inicializa durante la declaración sólo puede ser inicializada en bloque estático. Ejemplo:
class Example{ //static blank final variable static final int ROLL_NO; static{ ROLL_NO=1230; } public static void main(String args[]){ System.out.println(Example.ROLL_NO); } }
Salida:
1230
2) método final
Un método final no puede ser anulado. Lo que significa que aunque una subclase puede llamar al método final de la clase padre sin problemas, no puede anularlo.
Ejemplo:
class XYZ{ final void demo(){ System.out.println("XYZ Class Method"); } } class ABC extiende XYZ{ void demo(){ System.out.println("ABC Class Method"); } public static void main(String args[]){ ABC obj= new ABC(); obj.demo(); } }
El programa anterior arrojaría un error de compilación, sin embargo podemos usar el método final de la clase padre en la subclase sin problemas. Echemos un vistazo a este código: Este programa funcionaría bien ya que no estamos anulando el método final. Eso demuestra que los métodos finales son heredados pero no son elegibles para ser anulados.
class XYZ{ final void demo(){ System.out.println("XYZ Class Method"); } } la clase ABC extiende XYZ{ public static void main(String args[]){ ABC obj= new ABC(); obj.demo(); } }
Salida:
Método de la clase XYZ
3) clase final
No podemos extender una clase final. Considere el siguiente ejemplo:
clase final XYZ{ } clase ABC extiende XYZ{ void demo(){ System.out.println("Mi Método"); } public static void main(String args[]){ ABC obj= new ABC(); obj.demo(); } }
Salida:
El tipo ABC no puede subclasificar la clase final XYZ
Puntos para recordar:
1) Un constructor no puede ser declarado como definitivo.
2) La variable final local debe ser inicializada durante la declaración.
3) Todas las variables declaradas en una interfaz son por defecto finales.
4) No podemos cambiar el valor de una variable final.
5) Un método final no puede ser anulado.
6) Una clase final no puede ser heredada.
7) Si los parámetros del método se declaran finales, no se puede cambiar el valor de estos parámetros.
8) Es una buena práctica nombrar la variable final en todos los CAPS.
9) final, finally y finalize son tres términos diferentes. finally se usa en el manejo de excepciones y finalize es un método que es llamado por JVM durante la recolección de basura.