¿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.