Uso de variables estáticas en Java

Sabía que las variables estáticas se crean e inicializan solo una vez, es decir, cuando se carga la clase y no por objeto.

En el código que se muestra a continuación, lo que estoy tratando de hacer es: Declaré una variable int "a" como estática en la clase A y le asigné un valor de 5. Cuando se ejecuta el principal, cambié su valor a 6 e hice el programa para bucle infinitamente. Así que actualmente el valor "a" es 6.

Ahora, lo que traté de hacer es acceder a esta variable desde otra clase clase B cuando la clase A todavía está en bucle y esperaba que se imprimiera 6 cuando ejecuté la clase B (porque para cuando ejecuté el valor "a" de la clase B se cambia a 6) pero sorprendentemente todavía me dio 5.

¿Por qué sucede esto a pesar de que declaré "a" como estático? Incapaz de averiguar qué está mal con este enfoque.

class A{
    static int a=5;

    public static void main(String args[]){
        System.out.println(A.a+"");
        a=6;
        while(true){
        }
    }
}

class B{    
    public static void main(String args[]){
        System.out.println(A.a+"");
    }
}

preguntado el 21 de mayo de 12 a las 18:05

Está ejecutando dos programas separados a través de A.main y B.main. Tendría que usar subprocesos dentro del mismo proceso para demostrar lo que espera ver. -

O mejor: un bloque inicializador estático. -

No creo que los hilos sean necesarios. en B; `pubic static void main (String [] args) { A . principal (argumentos); Sistema . fuera . println ( A . a + "" ); } -

4 Respuestas

El problema que tiene es que está ejecutando dos procesos JVM diferentes. Lo que debería estar haciendo es ejecutar cada uno de sus métodos "principales" en su propio hilo. De esta forma comparten (y por lo tanto pueden modificar) la misma memoria. Aquí está su ejemplo modificado para usar hilos:

public class Main{
    public static int v = 5;

    public static void main(String[] args) throws Exception{
        new Thread(new A()).start();
        Thread.sleep(5000);
        new Thread(new B()).start();
    }
}

class A implements Runnable{
    public void run(){
        System.out.println(Main.v);
        Main.v = 6;
    }
}

class B implements Runnable{
    public void run(){
        System.out.println(Main.v);
    }
}

Nota al margen: si bien este ejemplo demuestra lo que se espera de la pregunta, todavía hay muchas cosas que están mal en términos de escribir un correcta Programa Java que utiliza múltiples subprocesos. Haz tu investigación.

contestado el 21 de mayo de 12 a las 18:05

tienes razón, traté de cargar los dos programas en diferentes procesos, ese es el error. ¡Gracias! - user1406427

Está ejecutando dos procesos Java y dos programas. El segundo cargador de clases carga class A y establece su variable estática en 5 pero no hay ninguna llamada en class B para invocar ese método estático main() definido en class A que lo incrementa a 6.

contestado el 21 de mayo de 12 a las 18:05

tienes razón, traté de cargar los dos programas en diferentes procesos, ese es el error. ¡Gracias! - user1406427

Realmente nunca ejecutas el bucle principal en A.

Solo crea un método para cambiar el valor.

contestado el 21 de mayo de 12 a las 18:05

Primero ejecuté la Clase A, por lo que el valor "a" debe cambiarse a 6. Después de esto, mientras se golpea A en un ciclo while, intenté acceder a "a" en la clase B y obtuve 5 como respuesta. - user1406427

¿Dónde ejecutas "A" primero? Tendrías que ejecutar esos dos en la misma clase, para obtener lo que quieres. Todavía son dos objetos separados en este momento, que no tienen nada que ver el uno con el otro. Entonces, solo está accediendo a la variable, sin cambiarla realmente antes de acceder con B. - omnibúho

tienes razón, traté de cargar los dos programas en diferentes procesos, ese es el error. ¡Gracias! - user1406427

Esto se debe a que el método principal de A nunca se invoca.

contestado el 21 de mayo de 12 a las 18:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.