Palabra Clave “final” en Java

Palabra Clave

La palabra clave “final” se usa en diferentes contextos. En primer lugar, final es un modificador de no acceso aplicable solo a una variable, un método o una clase. A continuación se muestran los contextos diferentes en los que se utiliza final.

1. Variables con Palabra Clave final

Cuando una variable se declara con la palabra clave final, su valor no se puede modificar, esencialmente, es una constante. Esto también significa que debe inicializar una variable final.

Si la variable final es una referencia, esto significa que la variable no se puede volver a vincular para hacer referencia a otro objeto, pero el estado interno del objeto apuntado por esa variable de referencia se puede cambiar, es decir, puede agregar o eliminar elementos de la matriz final o colección final.

Es una buena práctica representar las variables finales en mayúsculas, utilizando guiones bajos para separar las palabras.

Ejemplos:

final int LIMITE=5;
final int LIMITE;
static final double PI = 3.141592653589793;

1.1. Inicializar una variable final

Debemos inicializar una variable final, de lo contrario el compilador emitirá un error en tiempo de compilación. Una variable final solo se puede inicializar una vez, ya sea a través de un inicializador o una declaración de asignación. Hay tres formas de inicializar una variable final:

  1. Puede inicializar una variable final cuando se declara. Este enfoque es el más común. Una variable final se llama variable final en blanco si no se inicializa en la declaración.
  2. Se puede inicializar una variable final en blanco dentro del bloque inicializador de instancias o dentro del constructor. Si tiene más de un constructor en tu clase, debe inicializarse en todos ellos, de lo contrario se generará un error de tiempo de compilación.
  3. Una variable estática final en blanco se puede inicializar dentro de un bloque estático.

Veamos diferentes formas de inicializar una variable final a través de un ejemplo.

// Programa Java para demostrar diferentes formas 
// de inicializar una variable final
 
class JDC
{
    // una variable final
    // inicialización directa
    final int LIMITE = 5;
     
    // una variable final en blanco
    final int CAPACIDAD;
     
    // otra variable final en blanco
    final int MINIMO;
     
    // una variable static final PI
    // inicialización directa
    static final double PI = 3.141592653589793;
     
    // una variable static final en blanco
    static final double CONSTANTEEULER;
     
    // bloque inicializador de instancias
    // para inicializar CAPACIDAD
    {
        CAPACIDAD = 25;
    }
     
    // bloque inicializador static 
    // para inicializar CONSTANTEEULER
    static{
        CONSTANTEEULER = 2.3;
    }
     
    // consctructor para inicializar MINIMO
    // Tenga en cuenta que si hay más de un constructor, 
    // debe inicializar MINIMO en ellos también
    public JDC() 
    {
        MINIMO = -1;
    }
         
}

1.2. Cuándo usar una variable final

La única diferencia entre una variable normal y una variable final es que podemos reasignar el valor a una variable normal, pero no podemos cambiar el valor de una variable final una vez asignada. Por lo tanto, las variables finales deben usarse solo para los valores que queremos que permanezcan constantes durante la ejecución del programa.

1.3. Variable final de referencia

Cuando una variable final es una referencia a un objeto, esta variable final se denomina variable final de referencia. Por ejemplo, una variable final de StringBuffer se parece a:

final StringBuffer cadena;

Como sabes, una variable final no se puede reasignar. Pero en el caso de una variable final de referencia, se puede cambiar el estado interno del objeto señalado por esa variable de referencia. Tenga en cuenta que esto no es una reasignación. Esta propiedad de final se llama no-transitividad. Para entender qué significa el estado interno del objeto, consulte el siguiente ejemplo:

//Programa Java para demostrar
// la variable final de referencia
class JDC {
    public static void main(String[] args) {
        //una variable final de referencia
        final StringBuilder cadena=new StringBuilder("Java");

        System.out.println(cadena);

        //cambiando estado interno de referencia del objeto
        //por variable de referencia final 'cadena'

        cadena.append("desdeCero");
        System.out.println(cadena);
    }
}

Salida:

Java
JavadesdeCero

La propiedad no-transitividad también se aplica a las matrices, porque las matrices son objetos en Java. Las matrices con palabra clave final también se llaman matrices finales.

1.4. Notas Importantes

  • Como se discutió anteriormente, una variable final no se puede reasignar, y arrojará un error en tiempo de compilación.
//Programa Java para demostrar
//que la reasignación de la variable final
//lanzará un error en tiempo de compilación
class JDC {
  static final int CAPACIDAD=4;

    public static void main(String[] args) {
        //reasignando variable final
        CAPACIDAD=5;
    }
}

Salida:

Compiler Error: cannot assign a value to final variable CAPACIDAD
  • Cuando se crea una variable final dentro de un método/constructor/bloque, se denomina variable final local, y debe inicializarse una vez donde se crea. Ver a continuación el programa para la variable final local:
//Programa Java para demostrar
//una variable local final
class JDC {
    public static void main(String[] args) {
        //variable local final
       final int i;
       i=20;
        System.out.println(i);
    }
}

Salida:

20
  • Tenga en cuenta la diferencia entre las variables const de C++ y las variables final de Java. Las variables const en C++ deben tener un valor cuando se declaran. Para las variables final en Java, no es necesario como vemos en los ejemplos anteriores. A una variable final se le puede asignar valor más adelante, pero solo una vez.
  • final dentro del bucle for-each: la declaración final en for-each es una declaración legal.
//Programa Java para demostrar
//final con for-each
class JDC {
    public static void main(String[] args) {
       int arr[]={1,2,3};
       //final con sentencia for-each
        for (final int i:arr)
        System.out.println(i+"");
    }
}

Salida:

1
2
3
Explicación: Dado que la variable i está fuera del alcance de cada iteración del bucle, en realidad se vuelve a declarar cada iteración, lo que permite utilizar el mismo símbolo (es decir, i) para representar múltiples variables.

2. Clases finales

Cuando una clase se declara con la palabra clave final, se denomina clase final. Una clase final no se puede extender (heredar). Hay dos usos de una clase final:

  • Una es definitivamente evitar la herencia, ya que las clases finales no se pueden extender. Por ejemplo, todas las clases Wrapper como Integer, Float, etc. son clases finales. No podemos extenderlos.
final class A
{
     // métodos y campos
}
// La siguiente clase es ilegal.
class B extends A 
{ 
    // COMPILACIÓN-ERROR!
}
  • El otro uso de final con clases es crear una clase inmutable como la clase String predefinida. No puede hacer que una clase sea inmutable sin que sea definitiva.

3. Métodos finales

Cuando se declara un método con la palabra clave final, se denomina método final. Un método final no puede ser anulado. La clase Object hace esto: varios de sus métodos son FINALES. Debemos declarar los métodos con la palabra clave final para la cual necesitamos seguir la misma implementación en todas las clases derivadas. El siguiente fragmento ilustra la palabra clave final con un método:

class A 
{
    final void m1() 
    {
        System.out.println("Este es un método final.");
    }
}

class B extends A 
{
    void m1()
    { 
        // COMPILACIÓN-ERROR! 
        System.out.println("Ilegal!");
    }
}

Para obtener más ejemplos y el comportamiento de los métodos finales y las clases finales, consulte: Uso de final con herencia.

Keyword 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.