Uso de palabra clave final con Herencia en Java

POO

final es una palabra clave en Java utilizada para restringir algunas funcionalidades. Podemos declarar variables, métodos y clases con la palabra clave final.

Tan poderoso y útil como la anulación de método (method overriding) y la herencia, a veces querrás evitarlos. Por ejemplo, puede tener una clase que encapsule el control de algún dispositivo de hardware. Además, esta clase podría ofrecer al usuario la capacidad de inicializar el dispositivo, haciendo uso de información privada y de propiedad. En este caso, no desea que los usuarios de su clase puedan anular el método de inicialización.

Cualquiera que sea el motivo, en Java es fácil evitar que un método sea anulado o que una clase se herede usando la palabra clave final.

1. final para evitar anulación de métodos (Overriding)

Para evitar que un método sea anulado, especifique final como un modificador al comienzo de su declaración. Los métodos declarados como final no pueden anularse. El siguiente fragmento ilustra el uso de final:

class A {
   final void metodo(){
       System.out.println("Este es un método final.");
   }
}
class B extends A {
 void metodo(){ 
 //ERROR 
 // 'metodo()' cannot override 'metodo()' in 'A'; 
 // overridden method is final
 System.out.println("Ilegal!");
 }
}

Como metodo() se declara como final, no se puede sobrescribir en B. Si intentas hacerlo, se producirá un error en tiempo de compilación.

2. Uso de final para evitar herencia

Puede evitar que una clase se herede precediendo a su declaración con final.

Declarar una clase como final implícitamente declara también todos sus métodos como finales. Como era de esperar, es ilegal declarar una clase como abstracta y final ya que una clase abstracta es incompleta por sí misma y depende de sus subclases para proporcionar implementaciones completas. Aquí hay un ejemplo de una clase final:

class A {
   //...
}
//La siguiente clase es ilegal
class B extends A {
    //ERROR
}

Como se lee en los comentarios, es ilegal que B herede A ya que A se declara como final.

3. Usar final con los miembros de datos

Además de los usos de final que acabamos de mostrar, final también se puede aplicar a las variables miembro para crear lo que equivale a constantes con nombre. Si antecede el nombre de una variable de clase con final, su valor no se puede cambiar a lo largo de la vida útil de su programa.

Por supuesto, puede darle a esa variable un valor inicial. Por ejemplo, el siguiente ejemplo muestra una clase simple de gestión de errores llamada MsgError. Esa clase mapea una cadena legible por humanos a un código de error. Aquí, esa clase original contiene constantes finales que representan los errores. La idea es que en vez de pasarle a getMsgError() un número como 2, puede pasar la constante entera nombrada CERO.

//Retornando un objeto String
class MsgError {
    //Códigos de Error
    final int CERO =0;
    final int UNO = 1;
    final int DOS = 2;
    final int TRES = 3;

    String msgs[]={
            "ERROR CERO",
            "ERROR UNO",
            "ERROR DOS",
            "ERROR TRES"
    };

    //Retornando un mensaje de error
    String getMsgError(int i){
        if (i>=0&i<msgs.length)
            return msgs[i];
        else
            return "CÓDIGO DE ERROR INVÁLIDO";
    }
}
class FinalD {
    public static void main(String[] args) {
        MsgError error=new MsgError();

        System.out.println(error.getMsgError(error.CERO));
        System.out.println(error.getMsgError(error.DOS));
    }
}

Salida:

ERROR CERO
ERROR DOS

Observe cómo las constantes finales se usan en main(). Como son miembros de la clase MsgError, se debe acceder a ellos a través de un objeto de esa clase. Por supuesto, también pueden ser heredados por subclases y acceder directamente dentro de esas subclases.

Por cuestiones de estilo, muchos programadores de Java usan identificadores en mayúsculas para las constantes finales, como en el ejemplo anterior. Pero esta no es una regla.

Herencia en Java
  • Palabra clave final

Sobre el Autor:

Hey hola! Yo soy Alex Walton y tengo el placer de compartir conocimientos hacía ti sobre el tema de Programación en Java, desde cero, Online y Gratis.

Deja una Respuesta

*

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.