Variabili

di il
8 risposte

Variabili

Buonasera a tutti
ora che ho un po' di tempo libero mi son perso un po' in java e mi sono accorto che una cosa che davo per scontata, non mi è chiara.
inizierò a spiegare dall'inizio così da darvi una chiara idea delle mie attuali idee, cosicché poi voi possiate illuminarmi, d'immenso.

quando viene dichiarata una variabile, int numero;, per fare un esempio, il sistema in Runtime riserva nella memoria 32bit per questa variabile, o forse avviene alla sua inizializzazione?
detto questo, che non son sicuro sia corretto al 100%, il nome della variabile, numero, non è altro che un'etichetta, che serve a dare un nome all'indirizzo di memoria che è stato riservato per questa variabile e dove è quindi possibile trovare il suo, o i suoi, valori.
premettendo che fino a qua è corretto, se ne conviene quindi che, quando io assegno un valore alla mia variabile, vado semplicemente a immettere un'informazione nello spazio riservato a tale variabile (non riesco a spiegarmi meglio). provo a fare un esempio. se quando lo spazio viene riservato, viene occupato da 0000000000, poi quando gli assegno, per esempio, 5, allora lo spazio occupato cambierà in 0000500000.
ho provato a buttarla la per spiegare come penso io che funzioni il tutto.
comunque, sperando di essere stato chiaro, se poi faccio una cosa del genere
(scrivo tutto il codice in modo da non fare un papiro)

int numero = 5;
int prova = numero;
numero = 10;
System.out.println(numero + " " +  prova);
in output mi restituisce 10 e 5.
la mia perplessità quindi è la seguente:
se una variabile è semplicemente un puntatore in memoria, se io a un puntatore gli dico di puntare a sua volta a un altro puntatore, quando il valore del primo puntatore cambia, dovrebbe cambiare anche quello del secondo puntatore. quindi perché prova vale 5 e non 10?
spero di essermi spiegato bene

8 Risposte

  • Re: Variabili

    KuroKami69 ha scritto:


    quando viene dichiarata una variabile, int numero;, per fare un esempio, il sistema in Runtime riserva nella memoria 32bit per questa variabile, o forse avviene alla sua inizializzazione?
    La inizializzazione non c'entra. Una variabile int è a 32 bit quindi inizializzata esplicitamente o no, da qualche parte verrà comunque riservato uno spazio di 32 bit. Dove ... dipende da dove è lessicalmente definita la variabile nel sorgente.
    Se è una variabile locale (o parametro) è sullo stack. Se è una variabile di istanza/di classe è sul heap.

    KuroKami69 ha scritto:


    quando io assegno un valore alla mia variabile, vado semplicemente a immettere un'informazione nello spazio riservato a tale variabile (non riesco a spiegarmi meglio). provo a fare un esempio. se quando lo spazio viene riservato, viene occupato da 0000000000, poi quando gli assegno, per esempio, 5, allora lo spazio occupato cambierà in 0000500000.
    Così è un po' buttato lì .... se assegni un valore 305419896 ad una variabile int, in memoria ci saranno 4 byte 0x12 0x34 0x56 0x78 (0x12 è il byte "alto").

    KuroKami69 ha scritto:


    se una variabile è semplicemente un puntatore in memoria, se io a un puntatore gli dico di puntare a sua volta a un altro puntatore, quando il valore del primo puntatore cambia, dovrebbe cambiare anche quello del secondo puntatore. quindi perché prova vale 5 e non 10?
    No, non è il ragionamento corretto.

    Quando avviene:

    prova = numero

    succede che i 32 bit presenti in numero vengono COPIATI in prova. Vuol dire che lo stesso "pattern" di bit sarà presente in due locazioni di memoria distinte. Il pattern di bit E' il VALORE stesso intero. Ma le due variabili sono appunto DISTINTE. Quindi cambiare poi successivamente numero NON fa cambiare prova !
  • Re: Variabili

    Ho capito, è stata una spiegazione molto istruttiva, grazie
    la stessa cosa accade quindi con gli oggetti?
    se io ho un oggetto Prova p1 che la variabile n = 5; e dopo faccio p2 = p1; e poi cambio p1 = 10, accadrà la stessa cosa di prima o viene avvalorato il mio ragionamento?
  • Re: Variabili

    KuroKami69 ha scritto:


    la stessa cosa accade quindi con gli oggetti?
    se io ho un oggetto Prova p1 che la variabile n = 5; e dopo faccio p2 = p1; e poi cambio p1 = 10, accadrà la stessa cosa di prima o viene avvalorato il mio ragionamento?
    Se per i tipi primitivi il contenuto della variabile è un VALORE tangibile che puoi leggere, stampare (sommare, sottrarre ecc.. per i numerici), invece per le variabili reference il contenuto è anch'esso un VALORE .... solo che fa riferimento ad un oggetto. Ed è sostanzialmente un valore molto "opaco", perché non ci puoi fare nulla di particolare (non lo puoi stampare, non puoi farci "aritmetica", ecc...).
    Quanto occupa un reference in memoria non è fisso/noto a priori ... dipende dalla piattaforma e dalla implementazione della JVM. Diciamo che un reference occupa X bit. Se fai:

    Integer num1 = new Integer(123);
    Integer num2 = num1;
    num1 = new Integer(456);

    succede che alla fine di tutto quanto, num1 è un Integer 456 mentre num2 continua ad essere quel Integer 123.

    Quando avviene num2 = num1 succede che gli X bit presenti in num1 vengono COPIATI in num2. Vuol dire che lo stesso "pattern" di bit sarà presente in due locazioni di memoria distinte e vuol dire che in quel momento ci sono 2 variabili che fanno riferimento allo STESSO oggetto Integer (perché il valore reference è lo stesso).

    Ma le due variabili sono comunque DISTINTE. Quindi cambiare poi successivamente num1 NON fa cambiare num2 !
    La semantica quindi è la STESSA come per le variabili primitive. Viene copiato il VALORE. Che per i primitivi è già il valore boolean/numerico di interesse mentre per i reference è un valore "opaco" di cui non sappiamo nulla ma che fa riferimento ad un oggetto (se non-null ovviamente).
  • Re: Variabili

    Sto ancora con la testa un po' intontita ma penso di aver capito. domattina rileggo meglio e se non mi è chiaro qualcosa chiederò di nuovo
    anche se prima di andare pongo la domanda fatidica:
    posso fare in modo che date 2 variabili, senza usare lo static, al cambiare di una, cambi anche la seconda?
  • Re: Variabili

    KuroKami69 ha scritto:


    posso fare in modo che date 2 variabili, senza usare lo static, al cambiare di una, cambi anche la seconda?
    Non c'entra lo static o non static. Come lo stai sicuramente pensando tu, la risposta è NO.
    Una cella di memoria NON cambia "da sola, in automatico" solo perché un'altra altrove ha cambiato valore. Non funzionano così le cose (in tutti i sistemi, processori, memorie).

    Se vuoi cambiare una variabile, fai un assegnamento. Il valore assegnato è la COPIA di un pattern di bit, da un valore fisso es. 123 o da una variabile, con il valore che ha in quel momento.
    Fatto l'assegnamento, sorgente e destinazione sono e restano due cose distinte.
  • Re: Variabili

    Ho capito. però hai detto "come lo sto pensando io, no"
    quindi c'è comunque un modo? oppure non c'è proprio modo che al variare di una variabile, un'altra cambi di conseguenza?
  • Re: Variabili

    KuroKami69 ha scritto:


    quindi c'è comunque un modo? oppure non c'è proprio modo che al variare di una variabile, un'altra cambi di conseguenza?
    No, NON a livello di pura memoria. Non esiste che se un byte all'indirizzo es. 100000 cambia valore (per qualunque motivo), un altro byte distinto all'indirizzo es. 50000 cambia "automaticamente" di conseguenza. Non funzionano così le cose, non c'è proprio l'hardware per cose generalizzate del genere.

    Se invece intendi che se un oggetto Java ha un field privato xyz e vuoi che invocando setXyz(123) "qualcun'altro" (un altro oggetto) venga a conoscenza della modifica ... questo sì, è possibile. Ma sono meccanismi di più alto livello, resi possibili dal paradigma di programmazione (ad oggetti in questo caso) del linguaggio.
  • Re: Variabili

    Ho capito, grazie mille
Devi accedere o registrarti per scrivere nel forum
8 risposte