1. Variables estáticas

Cuando una clase se carga en la memoria, se crea inmediatamente un objeto estático . Este objeto almacena variables de clase estáticas (campos de clase estática). El objeto estático existe incluso si no se han creado objetos ordinarios (no estáticos) de la clase.

Cuando declaramos variables en una clase, indicamos si se crearán una sola vez o si debe haber distintas instancias de estas variables en cada objeto. De forma predeterminada, se crea una nueva copia de cada variable para cada objeto.

Una variable estática está vinculada al objeto estático de la clase y siempre hay una única instancia de la misma.

Para crear una variable estática en una clase, debe escribir la staticpalabra clave antes de su nombre. El formato general para declarar una variable estática es:

static Type name = value;

Si a una variable estática no se le asigna un valor inicial, se inicializa con un valor predeterminado:

Tipo Valor por defecto
byte
0
short
0
int
0
long
0
float
0.0
double
0.0
char
'\u0000'
(lo mismo que
0
)
boolean
false
Object
y cualquier clase
null

Ejemplos:

Código Nota
public static int WIDTH = 100;
public static String message = "Hello";
private static Scanner console;
private static int count = 0;
private static boolean flag;

Dentro de una clase, puede referirse a sus variables estáticas simplemente usando sus nombres. Pero para acceder a ellos desde otra clase, debe escribir el nombre de la clase antes del nombre de la variable estática.

ClassName.variable

Ejemplo:

Variable Clase Accediendo a una variable fuera de su clase
public static int WIDTH = 100;
Solution
Solution.WIDTH
public static String message = "Hello";
Main
Main.message
private static Scanner console;
JavaGame
La variable privatees No es visible fuera de la clase.
private static int count = 0;
Counter
La variable privatees No es visible fuera de la clase.
private static boolean flag;
Arithmetic
La variable privatees No es visible fuera de la clase.


2. Diferencia entre variables estáticas y no estáticas

Las variables no estáticas (ordinarias) de una clase se declaran de la misma manera que las estáticas, solo que sin la staticpalabra clave.

¿Cuál es la diferencia entre variables ordinarias y variables estáticas?

Las variables ordinarias de una clase están vinculadas a los objetos de la clase (instancias de la clase), mientras que las variables estáticas están vinculadas al objeto estático de la clase.

Si hay varias instancias de una clase, cada una de ellas tiene su propia copia de las variables no estáticas (ordinarias). Las variables estáticas de una clase siempre se almacenan en su objeto estático y solo existe una única instancia de ellas.

Puede acceder a las variables ordinarias (campos) de una clase solo si tiene una referencia a un objeto de la clase. Y dentro de los métodos de la clase, por supuesto.

Ejemplo:

Acceder a un campo de una clase usando una referencia de objeto
public class DataInfo
{
   public int value = 100;
}

public class Solution
{
   public static void main(String[] args)
   {
      DataInfo info = new DataInfo();
      System.out.println(info.value);
   }
}

Puede acceder a variables estáticas desde cualquier lugar (después de tener en cuenta los modificadores de visibilidad): desde métodos ordinarios, desde métodos estáticos de la misma clase, desde métodos de otras clases, etc.

Ejemplo:

Acceder a un campo estático de una clase sin usar una referencia de objeto
public class DataInfo
{
   public static int value = 100;
}

public class Solution
{
   public static void main(String[] args)
   {
      System.out.println(DataInfo.value);
   }
}

Cómo se organiza la memoria:

Digamos que tenemos una Personclase con 4 campos: dos son estáticos y dos no lo son.

public class Person
{
   public static int count = 0;
   public static int sum = 0;
   public int age = 0;
   public String name;
}

Inmediatamente después de cargar la clase

Cuando la máquina Java haya terminado de cargar la Personclase, la memoria se verá así:

Después de crear el primer objeto

Si creamos un Personobjeto, entonces la imagen se convierte en esta:

Diferencia entre variables estáticas y no estáticas 2

Tenga en cuenta que aunque ambos objetos tienen dos variables, estas son variables diferentes: los objetos ordinarios tienen variables ordinarias y el objeto estático tiene variables estáticas.

Necesitamos más objetos

Vamos a crear dos Personobjetos más. Ahora la memoria se verá así:

Diferencia entre variables estáticas y no estáticas 3

Tenga en cuenta que cada objeto tiene sus propias variables de edad y nombre.



3. Quitar y agregar el staticmodificador

De lo estático a lo ordinario

¿Qué sucede si tomamos una variable estática y la convertimos en una ordinaria eliminando su staticmodificador? Por ejemplo, la static int sumvariable.

El código modificado se verá así:

public class Person
{
   public static int count = 0;
   public int sum = 0;
   public int age = 0;
   public String name;
}

Ahora la memoria se ve así:

Diferencia entre variables estáticas y no estáticas

La variable estática desapareció del objeto estático y ahora cada objeto ordinario tiene su propia sumvariable.

De ordinario a estático

Podemos hacer lo contrario: agregar el staticmodificador a las variables ordinarias de una clase. Desaparecerán de todos los objetos ordinarios y aparecerán en el objeto estático. Supongamos que decidimos hacer que las variables agey namesean estáticas. Entonces el código se verá así:

public class Person
{
   public static int count = 0;
   public int sum = 0;
   public static int age = 0;
   public static String name;
}

Y ahora la memoria se verá así:

Quitar y agregar el modificador estático