Palabra clave estática de Java explicada con ejemplos

¿Qué significa estática?

Cuando declaras una variable o un método como estático, pertenece a la clase, en lugar de a una instancia específica. Esto significa que solo existe una instancia de un miembro estático, incluso si crea varios objetos de la clase o si no crea ninguno. Será compartido por todos los objetos.

La palabra clave estática se puede utilizar con variables, métodos, bloques de código y clases anidadas.

Variables estáticas

Ejemplo:

public class Counter { public static int COUNT = 0; Counter() { COUNT++; } }

La COUNTvariable será compartida por todos los objetos de esa clase. Cuando creamos objetos de nuestra clase Counter en main, y accedemos a la variable estática.

public class MyClass { public static void main(String[] args) { Counter c1 = new Counter(); Counter c2 = new Counter(); System.out.println(Counter.COUNT); } } // Outputs "2"

La salida es 2, porque la COUNTvariable es estática y se incrementa en uno cada vez que se crea un nuevo objeto de la clase Counter. También puede acceder a la variable estática utilizando cualquier objeto de esa clase, como c1.COUNT.

Métodos estáticos

Un método estático pertenece a la clase en lugar de a las instancias. Por lo tanto, se puede llamar sin crear una instancia de clase. Se utiliza para alterar el contenido estático de la clase. Existen algunas restricciones de los métodos estáticos:

  1. El método estático no puede utilizar miembros no estáticos (variables o funciones) de la clase.
  2. El método estático no puede utilizar thisni superpalabras clave.

Ejemplo:

public class Counter { public static int COUNT = 0; Counter() { COUNT++; } public static void increment(){ COUNT++; } }

Los métodos estáticos también se pueden llamar desde una instancia de la clase.

public class MyClass { public static void main(String[] args) { Counter.increment(); Counter.increment(); System.out.println(Counter.COUNT); } } // Outputs "2"

La salida es 2 porque se incrementa mediante un método estático increament(). De manera similar a las variables estáticas, también se puede acceder a los métodos estáticos utilizando variables de instancia.

Bloques estáticos

Los bloques de código estático se utilizan para inicializar variables estáticas. Estos bloques se ejecutan inmediatamente después de la declaración de variables estáticas.

Ejemplo:

public class Saturn { public static final int MOON_COUNT; static { MOON_COUNT = 62; } }
public class Main { public static void main(String[] args) { System.out.println(Saturn.MOON_COUNT); } } // Outputs "62"

La salida es 62, porque a la variable MOON_COUNTse le asigna ese valor en el bloque estático.

Clases anidadas estáticas

Una clase puede tener una clase anidada estática a la que se puede acceder mediante el nombre de clase externa.

Ejemplo:

public class Outer { public Outer() { } public static class Inner { public Inner() { } } }

En el ejemplo anterior, Innerse puede acceder directamente a la clase como miembro estático de la clase Outer.

public class Main { public static void main(String[] args) { Outer.Inner inner = new Outer.Inner(); } }

Uno de los casos de uso de clases anidadas estáticas en Builder Pattern que se usa popularmente en java.