Variabili d'istanza

di il
12 risposte

Variabili d'istanza

Buongiorno a tutti, un quesito di teoria:
- le variabili di istanza, ad esempio di tipo int, dopo essere state dichiarate ed inizializzate, se non sbaglio, vengono allocate nel registro di memoria di una istanza (oggetto);
- ma se nel codice, ad esempio quello sotto riportata, non ci sono oggetti, in quale memoria vengono salvate?...probabilmente in un altro codice eseguibile, con main, verranno creati oggetti e quindi le suddette variabili verranno salvate nei relativi registri degli oggetti creati...ma nel frattempo dove vengono allocate?
public class Somma2 {
    int x = 7;
    int y = 8;
    public int somma () {
        return x+y;
    }
}
Il "this" c'entra qualcosa?

12 Risposte

  • Re: Variabili d'istanza

    Friz02 ha scritto:


    - le variabili di istanza, ad esempio di tipo int, dopo essere state dichiarate ed inizializzate, se non sbaglio, vengono allocate nel registro di memoria di una istanza (oggetto);
    Una variabile di istanza si chiama "di istanza" proprio perché è associata a ciascuna istanza (oggetto) della classe in questione.

    Friz02 ha scritto:


    - ma se nel codice, ad esempio quello sotto riportata, non ci sono oggetti, in quale memoria vengono salvate?
    Solo con la definizione della classe (come hai scritto nel codice postato), infatti non hai istanziato alcun oggetto ... e quindi non c'è alcuna variabile di istanza allocata di quella classe.

    Friz02 ha scritto:


    ...probabilmente in un altro codice eseguibile, con main, verranno creati oggetti e quindi le suddette variabili verranno salvate nei relativi registri degli oggetti creati...ma nel frattempo dove vengono allocate?
    Solo quando fai (in qualunque punto lecito) es.

    Somma2 sA = new Somma2();

    allora viene creata una istanza della classe Somma2 e quindi sA farà riferimento ad un oggetto che sul "heap" di memoria della JVM occuperà 4+4 byte (per x e y, più qualcosina d'altro per l'oggetto in sé)

    Se fai un altro:
    Somma2 sB = new Somma2();

    avrai un altro oggetto ancora, ben distinto dall'altro e con i "suoi" x e y.

    Friz02 ha scritto:


    Il "this" c'entra qualcosa?
    Il "this" all'interno di metodi di istanza (o del costruttore) è semplicemente il riferimento all'oggetto su cui è stato invocato il metodo (o nel costruttore, l'oggetto che si sta creando).
  • Re: Variabili d'istanza

    Ok molto piu' chiaro ora, ma quindi i valori 7 e 8 prima che venga creata una istanza dove vengono salvate, nel registro di memoria della classe?
  • Re: Variabili d'istanza

    Friz02 ha scritto:


    Ok molto piu' chiaro ora, ma quindi i valori 7 e 8 prima che venga creata una istanza dove vengono salvate, nel registro di memoria della classe?
    7 e 8 sono delle "costanti" e fanno parte della definizione della classe (e sono valori fisicamente memorizzati nel file .class generato).
    Una classe ha sempre comunque almeno 1 costruttore. Il compilatore genera del codice (che è nel contesto del/i costruttore/i) che si occupa di eseguire gli inizializzatori delle variabili di istanza. Nel tuo esempio appunto tale codice generato si occupa di assegnare 7 e 8 alle variabili di istanza x e y ogni volta che un oggetto Somma2 viene istanziato.

    P.S. per scendere a livello ancora più "basso" per sapere esattamente cosa fa la JVM, dovresti vedere anche il bytecode generato .... non credo che sia una buona cosa se stai appena imparando Java. Per il momento dovrebbe bastarti sapere che ogni oggetto di una certa classe ha i suoi campi di istanza. Ovvero in memoria ogni oggetto occupa un certo spazio di memoria che comprende anche lo spazio per quelle variabili di istanza.
  • Re: Variabili d'istanza

    Grazie sei stato utilissimo, e con questo il problema è definitivamente risolto, in realtà l'ho presa un po' larga perchè il mo vero problema è proprio il this a cui accennavo.
    Non capisco il "PERCHE'" viene utilizzato, implicitamente o esplicitamente il this. Se ad esempio il compilatore non lo mettesse implicitamente cosa cavolo potrà mai succedere?...in alcuni testi viene detto: "....il reference this vine quindi implicitamente aggiunto nel bytecode compilato, per referenziare ogni variabile d'istanza non esplicitamente referenziata .....", mahh.
  • Re: Variabili d'istanza

    Friz02 ha scritto:


    Non capisco il "PERCHE'" viene utilizzato, implicitamente o esplicitamente il this. Se ad esempio il compilatore non lo mettesse implicitamente cosa cavolo potrà mai succedere?...in alcuni testi viene detto: "....il reference this vine quindi implicitamente aggiunto nel bytecode compilato, per referenziare ogni variabile d'istanza non esplicitamente referenziata .....", mahh.
    Ok. Allora, sempre con l'esempio della tua classe Somma2, se avessi:
    Somma2 a = new Somma2();
    Somma2 b = new Somma2();
    se io invoco a.somma(), come farebbe (senza il this) il codice eseguito in somma a sapere che deve referenziare x e y di a e non di b o che altro?? Pensaci ...

    Proprio a questo serve il this. All'interno dei metodi di istanza il this è il riferimento implicito all'oggetto su cui è stato invocato il metodo. Devi pensarlo come se al metodo venisse passato un argomento in più "implicito", nascosto, che è il riferimento all'oggetto che si sta usando per invocare il metodo.
    E non saresti molto lontano dalla realtà .... nel senso che è proprio così che funziona veramente nei linguaggi come C++ o Java (e sicuramente altri). Cioè invocando funzioni (dicesi metodi in Java) di "istanza" viene passato come argomento nascosto proprio il riferimento all'oggetto in questione, in modo che possa essere usato per referenziare le variabili di quella istanza o per invocare altri metodi sempre di quella istanza.
  • Re: Variabili d'istanza

    Ma quindi dove andrebbe messo il this in questo caso (cioè dove lo mette la JVM?).
  • Re: Variabili d'istanza

    Friz02 ha scritto:


    Ma quindi dove andrebbe messo il this in questo caso (cioè dove lo mette la JVM?).
    Scusa ma forse stai cercando di andare ad un livello un po' troppo specifico e che forse non ti aiuterebbe nemmeno più di tanto. Se proprio vuoi dettagli a questo livello, c'è il documento Java Virtual Machine Specification ma se stai imparando da poco Java probabilmente ti darebbe solo una marea di domande in più. È come se all'Autoscuola dessero da studiare il manuale d'uso della Ferrari di F1 ....

    Il "this" inteso ora come keyword, è la parola chiave che si può utilizzare nei sorgenti per fare riferimento all'oggetto su cui è stato invocato un metodo di istanza (o l'oggetto in costruzione, in un costruttore). Generalmente non serve esplicitarlo, in altri casi invece va usato esplicitamente.

    Tornando alla tua classe Somma2, il metodo somma potresti scriverlo così:
        public int somma () {
            return this.x+this.y;
        }
    Qui ho usato esplicitamente il this ma in questo caso è del tutto superfluo, alla fin fine è e funziona esattamente come l'hai scritto tu. Perché in un metodo di istanza di quella classe le variabili di istanza 'x' e 'y' sono "in scope" (nell'ambito di visibilità) a meno che vengano nascoste per qualche motivo (e in somma() non è così infatti).

    Se invece mettessi anche un metodo setter:
        public void setX(int x) {
            this.x = x;
        }
    allora qui devo usare this, perché il parametro 'x' nasconde (si chiama shadowing) il nome della variabile di istanza 'x'. E l'unico modo per referenziare il campo e non il parametro è quello di "qualificarlo" con il this.

    Ti è più chiaro ora?
  • Re: Variabili d'istanza

    Diciamo che ho qualcosa su cui riflettere , comunque le idee si stanno schiarendo, ti ringrazio.
    Per chiudere il quadro c'è una cosa che forse è la chiave del problema, spero..faccio un salto indietro:

    andbin ha scritto:


    Ok. Allora, sempre con l'esempio della tua classe Somma2, se avessi:
    Somma2 a = new Somma2();
    Somma2 b = new Somma2();
    se io invoco a.somma(), come farebbe (senza il this) il codice eseguito in somma a sapere che deve referenziare x e y di a e non di b o che altro?? Pensaci ...
    Perché dici che il codice eseguito non sa se referenziare x e y di a o di b?...Ma scusa non è stato a ad invocarlo?...dovrebbe prendere le variabili di a secondo logica, mi sa però che non è così.....provo a darmi una spiegazione: ....il metodo non sa chi lo ha invocato, se a o b, lui sa solo che deve fare x+y, ma non sa quali di queste prendere visto che ci sono due oggetti ognuno dei quali con le proprie variabili di istanza, allora implicitamente viene messo this.a.somma() cosicché il metodo ha un riferimento di a ed è quindi in grado di capire chi lo ha invocato e quali variabili referenziare...può essere un cosa del genere?
  • Re: Variabili d'istanza

    Friz02 ha scritto:


    Perché dici che il codice eseguito non sa se referenziare x e y di a o di b?...Ma scusa non è stato a ad invocarlo?
    Ok, mettiamola così, in modo molto (molto) generico: far eseguire un metodo (o "funzione membro" come si dice in C++) di una classe, alla fin fine vuol dire, a basso livello, fare in modo che il processore "salti" ad una locazione di memoria dove c'è il codice del metodo/funzione-membro. Ma questo non basta per i metodi/funzioni di istanza. La locazione dove c'è il codice non è l'oggetto in sé. Serve quindi una informazione di "contesto" in più, che alla fin fine è il riferimento (puntamento) all'oggetto, in modo che all'interno del metodo/funzione di istanza si possano usare altri membri di istanza relativi a quel oggetto preciso.
  • Re: Variabili d'istanza

    Ok, comunque nel frattempo ho capito...in effetti mi ero perso in un bicchier d'acqua.
    Lo hai studiato per conto tuo il Java o all'università, corsi, ecc...? io sono autodidatta, mi piacerebbe imparare a programmare e magari farlo come lavoro, chissà..
  • Re: Variabili d'istanza

    Friz02 ha scritto:


    Lo hai studiato per conto tuo il Java o all'università, corsi, ecc...?
    Java ho iniziato a studiarlo per conto mio nel 2006, arrivando poi ad ottenere le 2 certificazioni Sun.
    Ma comunque già prima avevo una "lunga" esperienza di programmazione.
  • Re: Variabili d'istanza

    Io sono da dieci anni nel settore dell''ingegneria impiantistica, quindi tutt'altro genere.
    Non so se sto facendo la cosa giusta, però la programmazione mi è sempre piaciuta, ho fatto C++ all'università niente di più.
    Se hai consigli da darmi su come affrontare questo "nuovo modo", se ne vale la pena dal punto di vista lavorativo, quanto tempo ci vorrà per iniziare a programmare seriamente, ecc... mi sarebbe d'aiuto....so che sono tutte cose relative però qualche consiglio da chi ha esperienza è sempre utile.
Devi accedere o registrarti per scrivere nel forum
12 risposte