Skip to content

Instancia vs estático

Published:

¿Alguna vez te haz preguntado, para que sirve la keyword static en Java?

static, indica que el método o campo, pertenece a la clase y no a las instancias, es decir, que este campo o método mantendrá su valor o implementación independiente de la instancia creada, esto, no quiere decir que el valor es inmutable, si no, que sólo se creara una única referencia a este valor.

Ej: El campo numberOfPlayers es estático esto quiere decir que no se necesita una instancia para acceder al campo, a diferencia de el campo score que sí necesita una instancia de la clase Player para acceder a él.

Loading graph...

Destacar que la referencia es sólo de una vía o “one way”, es decir, que no es reciproca, por lo tanto sólo los métodos y campos de instancia pueden referenciar en su implementación a los métodos y campos estáticos pertenecientes a la clase, pero no al revés.

Entonces el campo numberOfPlayers es sólo accesible desde la clase Player y no desde una instancia creada con la keyword new. así como también, el campo score es solo accesible desde una instancia creada de la clase Player.


class Player {
    static int numberOfPlayers = 0;
    int score;

    public Player(int score) {
        this.score = score;
        numberOfPlayers++;
    }
}

 Player juan = new Player(0);
 Player pedro = new Player(0);

/* el campo numberOfPlayers no existe en la instancia,
sólo en la clase */
 juan.numberOfPlayers;

/* Accedemos al campo estático a través de la clase Player */
 Player.numberOfPlayers;// 2

Creando métodos y campos estáticos y de instancia

Métodos y campos estáticos

No pueden poseer en su implementación llamadas a métodos de instancia y tampoco utilizar campos de instancia.


class Player {
    static int numberOfPlayers = 0;
    int score;

    public Player(int score) {
        this.score = score;
        numberOfPlayers++;
    }

    // Método no valido
    /*  En este caso la keyword `this`, no se puede utilizar, ya que,
        el método al ser estático, no tiene referencia de la instancia
        creada */
    public static int getPlayerScore() {

       return this.score;'Player.this' cannot be referenced from a static context
    }

    // Método valido
    /*  Dentro del método estático se pueden utilizar sólo variables
    estáticas */
    public static int getNumberOfPlayers() {
        return numberOfPlayers;
    }
}

💡 Para que quede más claro el ejemplo anterior, podemos pensar en que el campo o método estático, es parte de la clase y no es parte de la instancia, por lo tanto, la clase no tiene forma de referenciar las instancias que se crean, ya que, estas pueden crearse indefinidamente en runtime.

Métodos y campos de instancia

Sí pueden utilizar métodos y campos estáticos dentro de su implementación debido a que todas las instancias poseen la referencia a la clase de la cual fueron creadas.


class Player {
    static int numberOfPlayers = 0;
    int score;

    public Player(int score) {
        this.score = score;
        numberOfPlayers++;
    }

    // Método valido
    /*  En este caso la keyword `this`, si se puede utilizar, y también
    se pueden utilizar campos y métodos estáticos  */
    public static int getPlayerScore() {
    public int getPlayerScore() {
       if(getNumberOfPlayers() < 2) { // Llamada a un método estático
        return 0;
       }
       return this.score; // Accediendo a campos de instancia
    }

    // Método valido
    public int getNumberOfPlayers() {
        return numberOfPlayers;
    }
}

Conclusión

Los métodos y campos estáticos, se crean sólo una vez y pertenecen a la clase. Los métodos y campos de instancia, pertenecen al objeto creado a partir de la clase. Sólo los métodos y campos de instancia puede referenciar a los campos estáticos y no al revés.