CodeGym /Cursos /Sintaxis Java Cero /Variables estáticas

Variables estáticas

Sintaxis Java Cero
Nivel 12 , Lección 2
Disponible

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
Comentarios (6)
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION
Georgina Nivel 22, Hermosillo, Mexico
11 enero 2025
"Tierra: características técnicas". A ver, si entendí bien, creo que a todas las variables no estáticas se les debe asignar un valor. De hecho dicen las instrucciones "Todas las variables del objeto Planet deben asignarse valores en el método main.". Entonces , ¿porqué cuando le doy click en la solución me aparece un código que no tiene ningun método "main"?. Y todavía peor, este código se marca correcto en la plataforma web pero incorrecto en Intelij Idea?: package es.codegym.task.pro.task11.task1102; /* Tierra: características técnicas. */ public class Planet { public String name; public long age; public int speed; public int area; public void printInformation() { System.out.println("Planet name: " + name + "."); System.out.println("Age: " + age + "."); System.out.println("Orbital speed: " + speed + " km/h."); System.out.println("Total area: " + area + " km^2."); } }
Georgina Nivel 22, Hermosillo, Mexico
11 enero 2025
Perdon se que estoy haciendo muchas preguntas, es que me quedo con cara de ????. No puedo entender cuando debo escribir y cuando no un método main: private static void main. Y porqué aparecen unos códigos en la web y otros diferentes en el plugin de IntelijIdea. Alamejor soy la unica que no entiendo... pero espero alguien me pueda explicar... no le estoy entendiendo a este curso de Java.... Repito, estoy con cara de ????
Georgina Nivel 22, Hermosillo, Mexico
11 enero 2025
A ver si es correcto: ¿todos los códigos Java deben incluir la clase Solution y el método private statis void main?. Si la respuesta es sí, entonces, ¿porqué cuando le doy click en Validar, el sistema lo marca correcto en la página web, pero incorrecto en IntelijIdea?: package es.codegym.task.pro.task11.task1101; /* El sistema solar es nuestro hogar. */ public class SolarSystem { public static long age = 4_568_200_000L; public static int planetsCount = 8; public static int starsCount = 1; public static String starName = "Sol"; public static int distanceToGalacticCenter = 27170; }
Georgina Nivel 22, Hermosillo, Mexico
11 enero 2025
Porque entonces no entiendo en qué parte del código debo escribir la clase SolarSystem
Georgina Nivel 22, Hermosillo, Mexico
11 enero 2025
Todo esto es muy confuso
Maiev ShadowSong Nivel 13, Peru
22 enero 2025
en ese ejercicio solo tienes que llamar a las variables SolarSystem."nombre" , quiza te da error por los espacio , hay que tener cuidado en eso