Palabra Clave “static” en Java

Intermedio Palabra Clave

Aprenda qué es y cuándo usar la palabra clave “static” en Java. static es un modificador de no acceso en Java que se aplica a lo siguiente: bloques, variables, métodos y clases anidadas

Habrá momentos en que querrá definir un miembro de clase que se utilizará independientemente de cualquier objeto de esa clase. Normalmente, se debe acceder a un miembro de la clase a través de un objeto de su clase, pero es posible crear un miembro que se pueda usar por sí mismo, sin referencia a una instancia específica.

1. Palabra clave static

Para crear dicho miembro, preceda su declaración con la palabra clave static. Cuando un miembro se declara estático, se puede acceder antes de crear cualquier objeto de su clase y sin referencia a ningún objeto.

Puede declarar que tanto los métodos como las variables sean estáticos. El ejemplo más común de un miembro estático es main(). main() se declara como estático porque la JVM debe llamarlo cuando comienza tu programa. Fuera de la clase, para usar un miembro estático, solo necesita especificar el nombre de su clase seguido por el operador de punto. Ningún objeto necesita ser creado.

Por ejemplo, si desea asignar el valor 10 a una variable estática llamada contar que es parte de la clase Temporizador, use la siguiente línea:

Temporizador.contar = 10;

Este formato es similar al utilizado para acceder a las variables de instancia normales a través de un objeto, excepto que se utiliza el nombre de clase. Se puede invocar un método estático de la misma manera: mediante el uso del operador punto en el nombre de la clase.

static es un modificador de no acceso en Java que se aplica a lo siguiente:

  1. Variables
  2. Métodos
  3. Bloques
  4. Clases anidadas

2. Variables estáticas

Las variables declaradas como estáticas (static) son, esencialmente, variables globales. Cuando se declara un objeto, no se realiza una copia de una variable estática. En cambio, todas las instancias de la clase comparten la misma variable estática. Aquí hay un ejemplo que muestra las diferencias entre una variable estática y una variable de instancia:

Ejemplo:

// Ejemplo de variable estática

class StaticDemo
{
    int x; //Variable de instancia normal
    static int y; //Variable estática

    //Retornar la suma de la variable de instancia 'x'
    //y la variable estática 'y'
    int suma(){
        return x+y;
    }
}

class Test{
    public static void main(String[] args) {
        StaticDemo ob1=new StaticDemo();
        StaticDemo ob2=new StaticDemo();

        //Cada objeto tiene su propia copia de una variable de instancia
        ob1.x=10;
        ob2.x=12;

        System.out.println("Por supuesto, ob1.x y ob2.x son independientes.");
        System.out.println("ob1.x: "+ob1.x+"\nob2.x: "+ob2.x);
        System.out.println();

        //Cada objeto comparte una copia de una variable estática
        System.out.println("La variable estática 'y' es compartida.");
        StaticDemo.y=100;
        System.out.println("Cambio de StaticDemo.y a 100");

        System.out.println("ob1.suma(): "+ob1.suma());
        System.out.println("ob2.suma(): "+ob2.suma());
    }
}

Salida:

Por supuesto, ob1.x y ob2.x son independientes.
ob1.x: 10
ob2.x: 12

La variable estática 'y' es compartida.
Cambio de StaticDemo.y a 100
ob1.suma(): 110
ob2.suma(): 112

Como puede ver, la variable estática ‘y’ es compartida por ob1 y ob2. Cambiarlo afecta a toda la clase, no solo a una instancia.

3. Métodos estáticos

La diferencia entre un método estático y un método normal es que el método estático se llama a través de su nombre de clase, sin que se cree ningún objeto de esa clase. Ya ha visto un ejemplo de esto: el método sqrt(), que es un método estático dentro de la clase Math estándar de Java. Aquí hay un ejemplo que crea un método estático:

Ejemplo:

// Ejemplo de método estático

class StaticDemo
{
   static int valor=1024; //Una variable estática

   //Un método estático
   static int valDiv2(){
       return valor/2;
   }
}

class Test{
    public static void main(String[] args) {

        System.out.println("El valor es: "+StaticDemo.valor);
        System.out.println("StaticDemo.valDiv2(): "+StaticDemo.valDiv2());

        StaticDemo.valor=4;
        System.out.println("El valor es: "+StaticDemo.valor);
        System.out.println("StaticDemo.valDiv2(): "+StaticDemo.valDiv2());
    }
}

Salida:

El valor es: 1024
StaticDemo.valDiv2(): 512
El valor es: 4
StaticDemo.valDiv2(): 2

Los métodos declarados como static tienen varias restricciones:

  1. Pueden llamar directamente solo a otros métodos estáticos en su clase.
  2. Pueden acceder directamente solo a variables estáticas en su clase.
  3. Ellos no tienen una referencia this.

Por ejemplo, en la siguiente clase, el método estático valDivDenom() es ilegal:

class StaticoError{
    int denom=3; //Varianle de instancia
    static int valor=1024; //Variable estática

    /*Error! No se puede acceder a una variable no estática
    desde un método estático */
    static int valDivDenom(){
        return valor/denom; //No compilará
    }
}

Aquí, denom es una variable de instancia normal a la que no se puede acceder dentro de un método estático.

4. Bloques estáticos

Algunas veces, una clase requerirá algún tipo de inicialización antes de que esté lista para crear objetos. Por ejemplo, podría necesitar establecer una conexión a un sitio remoto. También podría necesitar inicializar ciertas variables estáticas antes de que se use cualquiera de los métodos estáticos de la clase.

Para manejar este tipo de situaciones, Java le permite declarar un bloque estático (Static Block). Un bloque estático se ejecuta cuando la clase se carga por primera vez. Por lo tanto, se ejecuta antes de que la clase se pueda usar para cualquier otro propósito. Aquí hay un ejemplo de un bloque estático:

Ejemplo:

// Ejemplo de bloque estático

class StaticDemo
{
   static double raizDe2;
   static double raizDe3;

   static {
       System.out.println("Dentro del bloque estático.");
       raizDe2=Math.sqrt(2.0);
       raizDe3=Math.sqrt(3.0);
   }

    StaticDemo (String msg){
       System.out.println(msg);
   }
}

class Test{
    public static void main(String[] args) {

        StaticDemo ob= new StaticDemo ("Dentro del Constructor.");

        System.out.println("La raíz cuadrada de dos es: "+StaticDemo.raizDe2);
        System.out.println("La raíz cuadrada de tres es: "+StaticDemo.raizDe3);

    }
}

Salida:

Dentro del bloque estático.
Dentro del Constructor.
La raíz cuadrada de dos es: 1.4142135623730951
La raíz cuadrada de tres es: 1.7320508075688772

Como puede ver, el bloque estático se ejecuta antes de que se construyan los objetos.

5. Clases anidadas estáticas

No podemos declarar la clase de nivel superior con un modificador estático, pero podemos declarar las clases anidadas como estáticas. Este tipo de clases se denominan clases estáticas anidadas. Para entender sobre las clase anidadas estáticas, consulte el siguiente artículo:

Lectura Recomendada
Clases Anidadas Estáticas
Keyword en Java
  • Palabra Clave “static” en Java

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.