Variables finales en blanco estáticas y no estáticas en Java

Una variable nos proporciona almacenamiento con nombre que nuestros programas pueden manipular. Hay dos tipos de variables de datos en una clase:
Variables de instancia: Las variables de instancia se declaran en una clase, pero fuera de un método, constructor o cualquier bloque. Cuando se asigna un espacio para un objeto en el montón, se crea una ranura para cada valor de variable de instancia. Las variables de instancia se crean cuando se crea un objeto con el uso de la palabra clave ‘nuevo’ y se destruyen cuando se destruye el objeto. Son propiedad de un objeto, por lo que solo se puede acceder a ellos usando el objeto.

Variables estáticas: las variables de clase, también conocidas como variables estáticas, se declaran con la palabra clave static en una clase, pero fuera de un método, constructor o bloque. Solo habría una copia de cada variable de clase por clase, independientemente de cuántos objetos se creen a partir de ella. Son propiedad de una clase, no de un objeto, por lo que se pueden usar directamente usando el nombre de la clase y usando el objeto.

// Java code to illustrate use of instance and static variables
public class Emp {
    String name;
    int salary;
    static String company;
    public void printDetails()
    {
        System.out.println("Name: " + name);
        System.out.println("Company: " + company);
        System.out.println("Salary: " + salary);
    }
    public static void main(String s[])
    {
        Emp.company = "GeeksForGeeks";
        Emp g = new Emp();
        g.name = "Shubham";
        g.salary = 100000;
  
        Emp sp = new Emp();
        sp.name = "Chirag";
        sp.salary = 200000;
  
        g.printDetails();
        sp.printDetails();
  
        g.company = "Google";
        g.salary = 200000;
        System.out.println("\nAfter change\n");
        g.printDetails();
        sp.printDetails();
    }
}

Producción:

Name: Shubham
Company: GeeksForGeeks
Salary: 100000
Name: Chirag
Company: GeeksForGeeks
Salary: 200000

After change

Name: Shubham
Company: Google
Salary: 200000
Name: Chirag
Company: Google
Salary: 200000

En el ejemplo anterior, al cambiar el nombre de la empresa, se refleja en todos los demás objetos, ya que es una variable estática. Pero cambiar el salario de g no cambia el salario de s porque el salario es una variable de instancia.

Variable final en blanco: Una variable final declarada pero no asignada se conoce como variable final en blanco. Solo se puede inicializar dentro de un constructor. Genera un error de compilación si no se inicializa porque se le debe dar un valor en algún lugar del programa y eso también solo de un constructor.

Variable final en blanco estática: Es una variable final en blanco declarada como estática. Es decir, una variable estática final declarada pero no se le da un valor o no se inicializa se conoce como variable final estática en blanco. Solo se puede inicializar a través de un bloque estático.
Aquí hay un ejemplo que ilustra la inicialización de variables finales en blanco:

// Java program to illustrate initialization 
// of blank final variables
public class GFG {
    private static final int a;
    private final int b;
    static
    {
        a = 1;
    }
    GFG(int c)
    {
        b = c;
    }
    public static void main(String s[])
    {
        GFG g1 = new GFG(10);
        GFG g2 = new GFG(20);
        System.out.println(GFG.a);
        System.out.println(g1.b);
        System.out.println(g1.b);
    }
}

Producción:

1
10
10

En el ejemplo anterior, b se inicializa usando un constructor mientras que a usa un bloque estático.

Prediga la salida del siguiente programa:

// Java program to illustrate 
// static blank final variable
public class UserLogin {
    public static final long GUEST_ID = -1;
    private static final long USER_ID;
    static
    {
        try {
            USER_ID = getID();
        }
        catch (IdNotFound e) {
            USER_ID = GUEST_ID;
            System.out.println("Logging in as guest");
        }
    }
    private static long getID()
        throws IdNotFound
    {
        throw new IdNotFound();
    }
    public static void main(String[] args)
    {
        System.out.println("User ID: " + USER_ID);
    }
}
class IdNotFound extends Exception {
    IdNotFound() {}
}

Producción:

prog.java:8: error: variable USER_ID might already have been assigned
USER_ID = GUEST_ID;
^
1 error

El campo USER_ID es un final estático en blanco. Está claro que la excepción puede lanzarse en el bloque try solo si falla la asignación a USER_ID, por lo que es perfectamente seguro asignar a USER_ID en el bloque catch. Cualquier ejecución del bloque inicializador estático provocará exactamente una asignación a USER_ID, que es justo lo que se requiere para los finales en blanco. Pero este programa falla porque, Un campo final en blanco puede asignarse solo en puntos del programa donde definitivamente no está asignado.

Aquí, el compilador no está seguro de si se ha asignado en el bloque de prueba o no, por lo que el programa no compila. Podemos resolver esto eliminando el bloque estático e inicializando USER_ID en el momento de la declaración.

// Java program to illustrate 
// static blank final variable
public class UserLogin {
    public static final long GUEST_ID = -1;
    private static final long USER_ID = getUserIdOrGuest();
    private static long getUserIdOrGuest()
    {
        try {
            return getID();
        }
        catch (IdNotFound e) {
            System.out.println("Logging in as guest");
            return GUEST_ID;
        }
    }
    private static long getID()
        throws IdNotFound
    {
        throw new IdNotFound();
    }
    public static void main(String[] args)
    {
        System.out.println("User ID: " + USER_ID);
    }
}
class IdNotFound extends Exception {
    IdNotFound() {}
}

Producción:

Logging in as guest
User ID: -1

Este artículo es una contribución de Shubham Juneja . Si le gusta GeeksforGeeks y le gustaría contribuir, también puede escribir un artículo usando contribuya.geeksforgeeks.org o envíe su artículo por correo a contribuya@geeksforgeeks.org. Vea su artículo que aparece en la página principal de GeeksforGeeks y ayude a otros Geeks.

Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *