Visualizzazione dei risultati da 1 a 7 su 7
  1. #1

    leggere contenuto variabile static da un'altra classe

    ciao a tutti,
    premetto che non conosco per niente java e sto iniziando a muovere i primi passi...
    è possibile leggere il contenuto di una variabile "static" posta nella classe A da un'altra classe B?

    io ho:

    public class A implements MessageListener {
    public static byte[] arr = new byte[297];

    public static void main(String[] args) throws Exception {
    int i;
    for (i=0;i<297;i++)
    arr[i]=1;
    } }

    ora voglio leggere il contenuto dell'array arr da un'altra classe B: (a me da tutti 0 anzichè tutti 1!!!!!!)

    public class B {

    public static void main(String[] args) throws FileNotFoundException, IOException {
    int i;
    for (i=0;i<297;i++)
    System.out.print( A.arr[i] );
    } }


    Chi mi sa dire dove sbaglio???
    grazie

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: leggere contenuto variabile static da un'altra classe

    Originariamente inviato da 88prototipo
    ora voglio leggere il contenuto dell'array arr da un'altra classe B: (a me da tutti 0 anzichè tutti 1!!!!!!)
    La questione è un'altra. Vedo che entrambe le classi hanno il main(). Quando lanci una applicazione specifichi la classe con il main ... chiaramente passi o A o B.

    Un campo "static" e "public" di A è certamente visibile a qualunque altra classe X purché X abbia innanzitutto la visibilità di A. Ma il fatto è che se hai lanciato la applicazione da B .... non viene certo invocato il main di A ... quindi ovviamente l'array resta inizializzato a 0.

    Un campo static è sì "globale" per così dire ... ma solo all'interno di una istanza della JVM .... non tra istanze differenti della JVM.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Utente di HTML.it
    Registrato dal
    Dec 2009
    Messaggi
    1,123

    Re: leggere contenuto variabile static da un'altra classe

    Originariamente inviato da 88prototipo
    ciao a tutti,
    premetto che non conosco per niente java e sto iniziando a muovere i primi passi...
    è possibile leggere il contenuto di una variabile "static" posta nella classe A da un'altra classe B?

    io ho:
    codice:
    public class A implements MessageListener {
      public static byte[] arr = new byte[297];
    
     public static void main(String[] args) throws Exception {
       int i;
       for (i=0;i<297;i++)
       arr[i]=1;
      }  
    }
    ora voglio leggere il contenuto dell'array arr da un'altra classe B: (a me da tutti 0 anzichè tutti 1!!!!!!)
    codice:
    public class B {
     
     public static void main(String[] args) throws FileNotFoundException, IOException {
      int i;
      for (i=0;i<297;i++)
      System.out.print( A.arr[i] );
     }  
    }
    Chi mi sa dire dove sbaglio???
    grazie
    Il primo errore è che una cosa di questo tipo non ha senso..
    Perchè creare 2 main? Generalmente il main() è quello che avvia l'applicazione, da li, si "dirama" l'intero software.
    Perchè quelle eccezioni?

    Sono tutti 0 perchè di fatto l'array è vuoto! Gli dai una dimensione, allochi la memoria, una volta terminato il software viene distrutto. Ma essendo una variabile static puoi accedervi comunque!

    Una variabile dichiarata come static è in sostanza una "variabile globale".
    Detto in altre parole, quando si crea un istanza di una classe e al suo interno c'è una variabile dichiarata come static, di questa non viene fatta alcuna copia. Mentre delle altre variabili vi è una copia per ogni oggetto. In sostanza ogni oggetto ha la stessa variabile static.

    codice:
    public class A {
      public static byte[] arr = new byte[297];
      static {
        for(int i=0; i<arr.length; i++) arr[i] = 1;
      }
    }
    Si può creare un blocco static, in modo da inizializzare le variabili static (in questo caso l'array).

    codice:
    class B {
      public static void main(String args[]) {
        for(int i=0; i<A.arr.length; i++) {
          System.out.println(A.arr[i]);
        }
      }
    }
    Ora vedrai tutti 1.

    PS: Anticipato da andbin mentre scrivevo ^^ (e litigavo con un moscerino).

  4. #4
    grazie a tutti!!! così funziona siete mitici!!!

  5. #5
    solo un'altra cosa...
    ma se io modifico i valori dell'array durante l'esecuzine del programma nella classe A, poi la classe B mi legge sempre 1. Posso leggere i nuovi valori dell'array dalla classe B?

    public class A implements MessageListener {

    public static byte[] arr = new byte[297];
    static {
    for(int i=0; i<arr.length; i++) arr[i] = 1;
    }

    public void messageReceived(int to, Message message) {
    int i,j,count;

    count=0;
    for(j=0; j<=4; j++)
    for (i=0;i < msg.get_length(); i++){
    arr[count]=bytes[msg.get_nodeid()][j][i];
    count++;
    }
    }

  6. #6
    Utente di HTML.it L'avatar di desa
    Registrato dal
    Oct 2008
    Messaggi
    569
    Innanzitutto, nei tuoi messaggi dovresti formattare il codice in modo da renderlo più leggibile a tutti: il risultato lo vedi nel post di Patrick Jane. Per farlo esiste un apposito tag "code", trovi un pulsante nella barra di edit di un nuovo post.

    Non mi è chiarissimo cosa intendi con la tua domanda... ma se ho capito giusto, la risposta è che quando vai ad accedere ad una variabile leggi il suo valore IN QUELL'ISTANTE (e questo indipendentemente dal fatto che sia o non sia "static"). Quindi se all'interno della classe A modifichi gli elementi contenuti nell'array, quando ci andrai ad accedere dalla classe B vi troverai dentro i valori aggiornati.

  7. #7
    Utente di HTML.it
    Registrato dal
    Dec 2009
    Messaggi
    1,123
    Proprio come desa non ho capito che intendi..

    Quello che hai postato è ambiguo.. perchè inizializzare a 1 gli elementi se non ne hai bisogno?
    Tieni presente che ogni modifica a quell'array riguarderà tutti gli oggetti.

    PS:
    La classe A volendo, potresti farla così
    codice:
    import java.util.Arrays;
    
    public class A {
      public static byte[] arr = new byte[297];
      static {
        Arrays.fill(arr,(byte)1);
      }
    }
    riempi arr con l'elemento passato nel parametro a destra.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.