Utilizarea variabilelor statice în Java

Știam că variabilele statice sunt create și inițializate doar o singură dată, adică atunci când clasa este încărcată și nu pe obiect.

În codul de mai jos ceea ce încerc să fac este: Am declarat o variabilă int "a" ca statică în clasa A și i-am atribuit o valoare de 5. Când execuția principală am schimbat valoarea la 6 și am făcut programul să buclă infinit. Deci, în prezent, valoarea "a" este de 6.

Acum, ceea ce am încercat să fac este că am încercat să accesez această variabilă de la clasa B de clasă B, atunci când clasa A este încă în buclă și m-am așteptat ca 6 să fie tipărită când am rulat clasa B (pentru că până când am rulat clasa B "a" este schimbat la 6) dar surprinzător mi-a mai dat 5.

De ce se întâmplă acest lucru chiar dacă am declarat "a" ca statică? Nu pot să dau seama ce este în neregulă cu această abordare.

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+"");
    }
}
2
Există două programe separate prin A.main și B.main . Va trebui să folosiți fire în același proces pentru a demonstra ceea ce așteptați să vedeți.
adăugat autor Steve Townsend, sursa
Sau mai bine - un bloc static de inițializare.
adăugat autor Hovercraft Full Of Eels, sursa
Nu cred că sunt necesare fire. În B; `public static void principal (String [] args) {A. principalele (args); Sistem. afară. println (A. a + ""); }
adăugat autor emory, sursa

4 răspunsuri

Problema pe care o aveți este că executați două procese JVM diferite. Ceea ce ar trebui să faceți este să rulați fiecare din cele "principale" metode în propria sa fire. În acest fel, aceștia împărtășesc (și prin urmare pot modifica) aceeași memorie. Iată exemplul dvs. modificat pentru a utiliza firele:

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

Notă laterală: În timp ce acest exemplu demonstrează ceea ce se așteaptă de la întrebare, există încă multe lucruri greșite în ceea ce privește scrierea unui program corect Java care utilizează mai multe fire. Faceți-vă căutarea.

4
adăugat
ya u r dreapta am încercat să încărcați cele două programe în diferite procese care este greșeala. Mulțumesc!
adăugat autor user1406427, sursa

Niciodată nu rulați cu adevărat bucla principală din A.

Faceți doar o metodă de modificare a valorii.

0
adăugat
Unde rulați mai întâi "A"? Ar trebui să conduci cei doi în aceeași clasă pentru a obține ceea ce vrei. Ele sunt încă două obiecte separate acum, care nu au nimic de-a face cu celălalt. Deci, doar accesați variabila, fără ao schimba cu adevărat înainte să o accesați cu B.
adăugat autor OmniOwl, sursa
am rulat clasa A, astfel încât valoarea "a" să fie schimbată la 6. După aceasta, în timp ce A este lovită într-o buclă în timp am încercat să accesez "a" în clasa B am primit 5 ca răspuns.
adăugat autor user1406427, sursa
ya u r dreapta am încercat să încărcați cele două programe în diferite procese care este greșeala. Mulțumesc!
adăugat autor user1406427, sursa

Aceasta deoarece principala metodă a lui A nu este invocată niciodată.

0
adăugat

Dvs. executați două procese Java și două programe. Cel de-al doilea clasificator încarcă class A și își stabilește variabila statică la 5, dar nu există apel în class B pentru a invoca acea metă statică principal() definită în < care o incrementează la 6.

0
adăugat
ya u r dreapta am încercat să încărcați cele două programe în diferite procese care este greșeala. Mulțumesc!
adăugat autor user1406427, sursa