Java Language
Usando la palabra clave estática
Buscar..
Sintaxis
- public static int myVariable; // Declarar una variable estática
- public static myMethod () {} // Declarar un método estático
- public static final final doble MY_CONSTANT; // Declarar una variable constante que se comparte entre todas las instancias de la clase
- final pública doble MY_CONSTANT; // Declarar una variable constante específica para esta instancia de la clase (mejor se usa en un constructor que genera una constante diferente para cada instancia)
Usando static para declarar constantes
Como la palabra clave static
se usa para acceder a los campos y métodos sin una clase instanciada, se puede usar para declarar constantes para usar en otras clases. Estas variables se mantendrán constantes en cada instanciación de la clase. Por convención, las variables static
siempre son ALL_CAPS
y usan guiones bajos en lugar de camel. ex:
static E STATIC_VARIABLE_NAME
Como las constantes no pueden cambiar, la static
también se puede usar con el modificador final
:
Por ejemplo, para definir la constante matemática de pi:
public class MathUtilities {
static final double PI = 3.14159265358
}
Que se puede usar en cualquier clase como una constante, por ejemplo:
public class MathCalculations {
//Calculates the circumference of a circle
public double calculateCircumference(double radius) {
return (2 * radius * MathUtilities.PI);
}
}
Usando estática con esto
Static proporciona un método o almacenamiento de variables que no se asigna para cada instancia de la clase. Más bien, la variable estática se comparte entre todos los miembros de la clase. Incidentalmente, tratar de tratar la variable estática como un miembro de la instancia de clase dará como resultado una advertencia:
public class Apple {
public static int test;
public int test2;
}
Apple a = new Apple();
a.test = 1; // Warning
Apple.test = 1; // OK
Apple.test2 = 1; // Illegal: test2 is not static
a.test2 = 1; // OK
Los métodos que se declaran estáticos se comportan de la misma manera, pero con una restricción adicional:
¡No puedes usar
this
palabra clave en ellos!
public class Pineapple {
private static int numberOfSpikes;
private int age;
public static getNumberOfSpikes() {
return this.numberOfSpikes; // This doesn't compile
}
public static getNumberOfSpikes() {
return numberOfSpikes; // This compiles
}
}
En general, es mejor declarar métodos genéricos que se aplican a diferentes instancias de una clase (como los métodos de clonación) static
, mientras que los métodos como equals()
no son estáticos. El main
método de un programa Java es siempre estática, lo que significa que la palabra clave this
no se puede utilizar dentro de main()
.
Referencia a miembro no estático del contexto estático
Las variables y los métodos estáticos no forman parte de una instancia. Siempre habrá una sola copia de esa variable, sin importar cuántos objetos cree de una clase en particular.
Por ejemplo, es posible que desee tener una lista inmutable de constantes, sería una buena idea mantenerla estática e inicializarla solo una vez dentro de un método estático. Esto le daría un aumento significativo de rendimiento si está creando varias instancias de una clase en particular de forma regular.
Además, también puedes tener un bloque estático en una clase. Puede usarlo para asignar un valor predeterminado a una variable estática. Se ejecutan solo una vez cuando la clase se carga en la memoria.
La variable de instancia como el nombre sugiere depende de una instancia de un objeto en particular, viven para servir a sus caprichos. Puedes jugar con ellos durante un ciclo de vida particular de un objeto.
Todos los campos y métodos de una clase utilizados dentro de un método estático de esa clase deben ser estáticos o locales. Si intenta utilizar variables o métodos de instancia (no estáticos), su código no se compilará.
public class Week {
static int daysOfTheWeek = 7; // static variable
int dayOfTheWeek; // instance variable
public static int getDaysLeftInWeek(){
return Week.daysOfTheWeek-dayOfTheWeek; // this will cause errors
}
public int getDaysLeftInWeek(){
return Week.daysOfTheWeek-dayOfTheWeek; // this is valid
}
public static int getDaysLeftInTheWeek(int today){
return Week.daysOfTheWeek-today; // this is valid
}
}