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
    }
    
}


Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow