Palabra clave static en Java

Palabra clave estática en Java se utiliza mucho en la programación Java. La palabra clave estática de Java se utiliza para crear una variable a nivel de clase en Java. Las variables y métodos estáticos son parte de la clase, no de las instancias de la clase.

palabra clave estática en Java

Java estática la palabra clave se puede usar en cinco casos como se muestra en la imagen a continuación. Discutiremos cuatro de ellos aquí, el quinto fue introducido en Java 8 y se ha discutido en Cambios en la interfaz de Java 8.

  1. Variable estática de Java

    Podemos usar la palabra clave static con una variable de nivel de clase. Una variable estática es una variable de clase y no pertenece al objeto/instancia de la clase. Dado que las variables estáticas son compartidas entre todas las instancias del objeto, no son seguras para subprocesos. Por lo general, las variables estáticas se usan con la palabra clave final para recursos comunes o constantes que pueden ser utilizados por todos los objetos. Si la variable estática no es privada, podemos acceder a ella con NombreDeClase.nombreVariable

        // Ejemplo de variable estática
        private static int count;
        public static String str;
        public static final String DB_USER = "miusuario";
    
  2. Método estático de Java

    Igual que una variable estática, un método estático pertenece a la clase y no a las instancias de la clase. Un método estático solo puede acceder a variables estáticas de la clase e invocar métodos estáticos de la clase. Por lo general, los métodos estáticos son métodos de utilidad que queremos exponer para ser utilizados por otras clases sin la necesidad de crear una instancia. Por ejemplo, la clase Collections, las clases de envoltura de Java como Java Wrapper y las clases de utilidad contienen muchos métodos estáticos. El método main() que es el punto de entrada de un programa Java en sí mismo es un método estático.

    // Ejemplo de método estático
    public static void setCount(int count) {
        if(count > 0)
        StaticExample.count = count;
    }
    
    // Método utilitario estático
    public static int addInts(int i, int...js){
        int sum=i;
        for(int x : js) sum+=x;
        return sum;
    }
    

    A partir de Java 8, también podemos tener métodos estáticos en interfaces. Para obtener más detalles, por favor lee Java 8 cambios en la interfaz.

  3. Bloque estático de Java

    El bloque estático de Java es el grupo de declaraciones que se ejecuta cuando la clase se carga en la memoria por Java ClassLoader. El bloque estático se utiliza para inicializar las variables estáticas de la clase. Principalmente se usa para crear recursos estáticos cuando se carga la clase. No podemos acceder a variables no estáticas en el bloque estático. Podemos tener varios bloques estáticos en una clase, aunque no tiene mucho sentido. El código del bloque estático se ejecuta solo una vez cuando la clase se carga en la memoria.

        static{
            // se puede utilizar para inicializar recursos cuando la clase se carga
            System.out.println("Bloque estático de ejemplo");
            // solo puede acceder a variables y métodos estáticos
            str="Prueba";
            setCount(2);
        }
    
  4. Clase Estática de Java

    Podemos usar la palabra clave `static` con clases anidadas. La palabra clave `static` no se puede usar con clases de nivel superior. Una clase anidada estática es igual que cualquier otra clase de nivel superior y está anidada solo por conveniencia de empaquetado. Leer: Clases Anidadas de Java

Veamos todos los usos de la palabra clave `static` en Java en un programa de ejemplo. StaticExample.java

package com.journaldev.misc;

public class StaticExample {

    //bloque statico
    static{
        //se puede utilizar para inicializar recursos cuando la clase se carga
        System.out.println("StaticExample static block");
        //puede acceder solo a variables y métodos estáticos
        str="Test";
        setCount(2);
    }
    
    //múltiples bloques staticos en la misma clase
    static{
        System.out.println("StaticExample static block2");
    }
    
    //ejemplo de variable estática
    private static int count; //kept private to control its value through setter
    public static String str;
    
    public int getCount() {
        return count;
    }

    //ejemplo de método estático
    public static void setCount(int count) {
        if(count > 0)
        StaticExample.count = count;
    }
    
    //método utilitario estático
    public static int addInts(int i, int...js){
        int sum=i;
        for(int x : js) sum+=x;
        return sum;
    }

    //ejemplo de clase estática: se utiliza solo por conveniencia de empaquetado
    public static class MyStaticClass{
        public int count;
        
    }

}

Veamos cómo usar variable estática, método y clase estática en un programa de prueba. TestStatic.java

package com.journaldev.misc;

public class TestStatic {

    public static void main(String[] args) {
        StaticExample.setCount(5);
        
        //variables estáticas no privadas se pueden acceder con el nombre de la clase
        StaticExample.str = "abc";
        StaticExample se = new StaticExample();
        System.out.println(se.getCount());
        //variables estáticas de clase e instancia son iguales
        System.out.println(StaticExample.str +" is same as "+se.str);
        System.out.println(StaticExample.str == se.str);
        
        //las clases anidadas estáticas son como las clases normales de nivel superior
        StaticExample.MyStaticClass myStaticClass = new StaticExample.MyStaticClass();
        myStaticClass.count=10;
        
        StaticExample.MyStaticClass myStaticClass1 = new StaticExample.MyStaticClass();
        myStaticClass1.count=20;
        
        System.out.println(myStaticClass.count);
        System.out.println(myStaticClass1.count);
    }
    
}

La salida del ejemplo de programa anterior con la palabra clave `static` en Java es:

StaticExample static block
StaticExample static block2
5
abc is same as abc
true
10
20

Observa que el código del bloque estático se ejecuta primero y solo una vez tan pronto como la clase se carga en la memoria. Las demás salidas son autoexplicativas.

Importación estática en Java

Normalmente accedemos a los miembros estáticos utilizando la referencia de la clase, desde Java 1.5 podemos utilizar la importación estática de Java para evitar la referencia de clase. A continuación, se muestra un ejemplo simple de importación estática en Java.

package com.journaldev.test;

public class A {

	public static int MAX = 1000;
	
	public static void foo(){
		System.out.println("foo static method");
	}
}
package com.journaldev.test;

import static com.journaldev.test.A.MAX;
import static com.journaldev.test.A.foo;

public class B {

	public static void main(String args[]){
		System.out.println(MAX); //normally A.MAX
		foo(); // normally A.foo()
	}
}

Observa las declaraciones de importación, para la importación estática debemos usar import static seguido del miembro estático completamente clasificado de una clase. Para importar todos los miembros estáticos de una clase, podemos usar * como en import static com.journaldev.test.A.*;. Deberíamos usarlo solo cuando estemos utilizando la variable estática de una clase varias veces, no es bueno para la legibilidad. Actualización: Recientemente he creado un video para explicar la palabra clave estática en Java, deberías verlo a continuación. https://www.youtube.com/watch?v=2e-l1vb\_fwM

Source:
https://www.digitalocean.com/community/tutorials/static-keyword-in-java