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 static
palabra 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 |
---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
(lo mismo que
) |
|
|
y cualquier clase |
|
Ejemplos:
Código | Nota |
---|---|
|
|
|
|
|
|
|
|
|
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 |
---|---|---|
|
|
|
|
|
|
|
|
La variable private es No es visible fuera de la clase. |
|
|
La variable private es No es visible fuera de la clase. |
|
|
La variable private es 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 static
palabra 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 |
---|
|
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 |
---|
|
Cómo se organiza la memoria:
Digamos que tenemos una Person
clase 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 Person
clase, la memoria se verá así:
Después de crear el primer objeto
Si creamos un Person
objeto, entonces la imagen se convierte en esta:
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 Person
objetos más. Ahora la memoria se verá así:
Tenga en cuenta que cada objeto tiene sus propias variables de edad y nombre.
3. Quitar y agregar el static
modificador
De lo estático a lo ordinario
¿Qué sucede si tomamos una variable estática y la convertimos en una ordinaria eliminando su static
modificador? Por ejemplo, la static int sum
variable.
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í:
La variable estática desapareció del objeto estático y ahora cada objeto ordinario tiene su propia sum
variable.
De ordinario a estático
Podemos hacer lo contrario: agregar el static
modificador 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 age
y name
sean 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í:
GO TO FULL VERSION