Static, instanza

di il
11 risposte

Static, instanza

Ciao ragazzi...
Una curiosità mi preme.
La differenza tra variabile statica e d'istanza.
Vorrei capire cosa succede a livello di memoria.
Io immagino la definizione di una classe. E' solo una definizione, in teoria non dovrebbe occupare ram.
Quando istanzio i tre oggetti, allora avrò tre zone di memoria distinte.
I tre oggetti hanno stesso stato, attributo e comportamento.
Ovvio solo quando li istanzi.
Poi succede che la classa ha pure un metodo static.
Il metodo static, condiviso da tutti gli oggetti, risede in teoria in una quarta zona di memoria ram.
Se cosi, allora la definizione di una classe, ha pure lei un allocazione in memoria, che dovrebbe occupare gli stessi bit di un oggetto istanziato.

Sono sulla strada giusta??
In tutto questo centrerà' il bytecode??

11 Risposte

  • Re: Static, instanza

    Stai facendo un po' di confusione tra variabile/field e metodo!

    Suddividi il problema in 2 parti:

    1) metodo statico: e' un normale metodo ma, invece di ricevere il puntatore ad un oggetto, riceve NULL.
    Poiche' NULL non punta a nulla, il metodo statico non puo' accedere a nessun membro di istanza

    2) membro/field statico: e' un'area di memoria allocata quando viene allocato lo spazio per il DESCRITTORE della classe, che ANCHE LUI e' un oggetto, ed in particolare e' UN'ISTANZA della classe Java "java.lang.Class".

    La definizione e' un po' incasinata, e' vero. Ma siamo in cima alla gerarchia di oggetti, se ci pensi un po' non e' difficile capirlo.

    Riassumendo:

    Hai DUE CLASSI fondamentali: Object, e Class (che deriva da Object).

    La definizione di tutte le classi derivano da Object, e vengono descritte mediante un'ISTANZA della classe "Class".
    La classe Class e' definita a sua volta da un'ISTANZA di se stessa!
  • Re: Static, instanza

    Grazie della risposta.
    Mi sembra di capire quindi che è un istanza di se stessa, ma non è reference di nessun puntatore.
    Devo rileggere con più attenzione la risp. dopo lavoro.
    Grazie ancora!!

    Ps.
    Qui qualcosa centra con il costruttore.
    Quello che ha lo stesso nome di classe senza nessun ritorno.
    E' lui allora che istanzia la classe...
  • Re: Static, instanza

    Alexxandro ha scritto:


    Grazie della risposta.
    Mi sembra di capire quindi che è un istanza di se stessa, ma non è reference di nessun puntatore.
    Devo rileggere con più attenzione la risp. dopo lavoro.
    Grazie ancora!!

    Ps.
    Qui qualcosa centra con il costruttore.
    Quello che ha lo stesso nome di classe senza nessun ritorno.
    E' lui allora che istanzia la classe...
    Qualche chiarimento in più mi pare necessario e utile.

    Un membro (variabile o metodo) "di istanza" (non static) è associato distintamente a ciascun oggetto (=istanza di quella classe). Se una classe X ha un private String nome;, ciascun oggetto X ha il suo proprio campo nome distinto da quello di tutti gli altri oggetti. Un oggetto X potrebbe avere nome "Mario", un altro oggetto X nome "Roberto", ecc...
    E un metodo di istanza può (ed è quello per cui ha senso che esista) accedere e operare su quello "stato" dell'oggetto.

    Un membro (variabile o metodo) "di classe" (static !) è associato alla classe (non a ciascun distinto oggetto), quindi il membro è "unico" e diciamo "globale", indipendentemente da quanti oggetti vengono istanziati di quella classe.

    Non è il costruttore che istanzia un oggetto (non nel senso della memoria). Lo spazio di memoria per un oggetto è allocato dalla JVM. Il costruttore è da vedere come un metodo molto speciale (e che secondo il Java Language Specification non è un "membro" della classe ["Constructor declarations are not members"]) che viene invocato dalla JVM (e nota, DOPO che lo spazio di memoria per l'oggetto è stato allocato) per 2 scopi principali:

    - invocare tassativamente il super-costruttore, quello della super-classe (e la cosa andrà avanti fin su al costruttore di Object).
    - eventualmente, se/come necessario, impostare lo "stato" iniziale dell'oggetto per la parte inerente chiaramente a quella classe.
  • Re: Static, instanza

    Grazie Andbin..
    Non ho capito bene la questione costruttore.
    Ho capito tipo che il costruttore fa delle chiamate a ritroso fino a tornare alla radice, il costruttore Object.
    Morale della favola se ho ad esempio
    un metodo static
    avrò il mio metodo allocato nella zona di memoria dedicata al descrittore.
    A questo punto tutti gli oggetti della medesima classe,
    condividono un qualche riferimento, al metodo static, e quindi a quell'allocazione di memoria dedicata al descrittore.
    Questo spiega in un certo senso, anche perchè in java l'inizializzazione di default, ha tutti valori 'neutri'.
    Non come in 'C' che passava qualsiasi cosa trova ahahah.
  • Re: Static, instanza

    Alexxandro ha scritto:


    Non ho capito bene la questione costruttore.
    Ho capito tipo che il costruttore fa delle chiamate a ritroso fino a tornare alla radice, il costruttore Object.
    Una classe ha sempre almeno un costruttore, implicito e esplicito che sia. Un qualunque costruttore in qualche modo (idem, implicitamente o esplicitamente) dovrà sicuramente far invocare il costruttore della super-classe. E così via ... E quindi si arriverà ad un certo punto ad Object, il cui costruttore non fa nulla e non chiama altro.

    Alexxandro ha scritto:


    Morale della favola se ho ad esempio
    un metodo static
    avrò il mio metodo allocato nella zona di memoria dedicata al descrittore.
    A questo punto tutti gli oggetti della medesima classe,
    condividono un qualche riferimento, al metodo static, e quindi a quell'allocazione di memoria dedicata al descrittore.
    Credo che stai "banalizzando" troppo su questi aspetti (e che comunque NON sono particolarmente importanti per chi programma in Java). Puoi provare a leggere il The Java Virtual Machine Specification ma ... non è facile. E non credo ti servirà ... (al massimo ti confonderebbe di più)

    Alexxandro ha scritto:


    Questo spiega in un certo senso, anche perchè in java l'inizializzazione di default, ha tutti valori 'neutri'.
    No, non c'entra tanto con i "costruttori". La JVM fornisce la garanzia che NON vedrai mai dati "spazzatura" (roba che c'era prima in memoria chissà come), né nelle variabili (di classe/di istanza) né negli elementi degli array.
  • Re: Static, instanza

    Più che per programmare, m'interessa sape realmente cosa succede nella macchina. Mi aiuta a capire.
    Continuando a leggere il libro, sono arrivato all' Ereditarietà, dove mi è venuta in mente un altra domanda, sempre inerente al discorso.
    Cioè con quell'estensione "extend"
    una classe derivata, eredita i metodi e le variabili d'istanza della classe base.
    Quindi le variabili ed i metodi d'istanza , ereditati dalla classe derivata vengono
    istanziati tutti insieme nello stesso oggeto creato dalla classe derivata.
  • Re: Static, instanza

    Alexxandro ha scritto:


    Cioè con quell'estensione "extend"
    una classe derivata, eredita i metodi e le variabili d'istanza della classe base.
    Quindi le variabili ed i metodi d'istanza , ereditati dalla classe derivata vengono
    istanziati tutti insieme nello stesso oggeto creato dalla classe derivata.
    Sì. Tieni presente che in Java "ereditare" un membro significa poter "accedere" al membro. È una questione di visibilità che dipende chiaramente dal livello di accesso dei membri.

    Il libro "The Java Programming Language, Fourth Edition" quando parla del override dei metodi dice:

    "A method can be overridden only if it is accessible. If the method is not accessible then it is not inherited, and if it is not inherited it can't be overridden"

    La questione della accessibilità è la stessa anche con le variabili di istanza.

    Prendiamo questo esempio:
    public class A {
        private int val1;
    }
    
    public class B extends A {
        private int val2;
    }
    Quando crei una istanza di B, nell'oggetto ci sono effettivamente 2 campi, val1 e val2. Perché rappresentano lo "stato" complessivo dell'oggetto dato da tutte le classi coinvolte (A e B). Questo è assolutamente così, indipendentemente dal livello di accesso delle variabili. I campi di istanza ci sono sempre tutti nell'oggetto. Se istanzi un A, chiaramente l'oggetto ha solo val1.

    Succede però che siccome val1 è private, allora NON è accessibile da B e quindi il risultato finale è che B NON "eredita" il membro val1.
  • Re: Static, instanza

    Mi è sembrato di capire che alla fine, istanza significa un oggetto viene caricato in memoria centrale, ed occupa un area di memoria distinta che è uguale all'area occupata dalla sua definizione,nella classe. Tant'è vero che un oggetto è un stampo della classe, un blueprint.

    il teskManager di win è diviso in 3 elementi, ma ne prendo in considerazione due, applicazioni visibile e applicazioni in backgrount, ed escludo i processi.
    Ho queste due classi
    import javax.swing.JFrame;
    import javax.swing.JLabel;

    public class PrimoEsempioSwing {
    public static final int LARGHEZZA =300;
    public static final int ALTEZZA =200;

    public static void main(String args[]){
    JFrame finestra = new JFrame("");
    finestra.setSize(LARGHEZZA,ALTEZZA);
    JLabel etichetta = new JLabel("Non premere quel pulsante");

    finestra.add(etichetta);

    DistruttoreFinestra ascoltatore = new DistruttoreFinestra();
    finestra.addWindowListener(ascoltatore);

    finestra.setVisible(true);<----------------
    }
    }
    [code ]import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; public class DistruttoreFinestra extends WindowAdapter { public void windowClosing(WindowEvent e){ System.out.println("PROGRAMMA CHIUSO"); System.exit(0); } } Se imposto il valore come true, il file class col main, mi parte e vedo la finestra.
    In questo momento è visibile l'istanza nelle attivita del tesk manager.
    Quando lo chiudo con la crocetta, l'istanza viene chiusa e per effetto della garbage, la zona di memoria deve essere "ripulita"?
    Cmq nel teskManager non compare più, quando la finestra viene chiusa.

    Se invece cambio l'argomento con false, e lancio il file, sul tesk, non c'è traccia del file avviato, neanche su app. in backGround.
    Ma in realtà, il file dovrebbe stare li fermo in memoria, e gieare in teoria in backGround.
  • Re: Static, instanza

    Alexxandro ha scritto:


    Mi è sembrato di capire che alla fine, istanza significa un oggetto
    Sì, "istanziare una classe" o "creare una istanza di una classe" significa creare un nuovo oggetto del tipo di quella classe.

    Alexxandro ha scritto:


    ed occupa un area di memoria distinta che è uguale all'area occupata dalla sua definizione,nella classe.
    Qui è un po' confuso ... la definizione di una classe è una cosa ed occupa una certa quantità di memoria. Un altro conto sono gli oggetti, che occuperanno ciascuno un'area di memoria che è ben distinta tra loro ma anche ben distinta da quella dove è rappresentata la definizione della classe.

    Alexxandro ha scritto:


    Se imposto il valore come true, il file class col main, mi parte e vedo la finestra.
    In questo momento è visibile l'istanza nelle attivita del tesk manager.
    Se un task manager mostra le varie "attività", quelle che mostra sono le finestre visibili (se una applicazione Java ha aperto 2 finestre, ne elencherà 2). Sicuramente il task manager ti mostra anche i processi veri e propri, e quella che puoi vedere è la voce relativa al processo di java.exe (o equivalente per altro SO) e questo è il processo in cui gira la istanza della JVM.

    Alexxandro ha scritto:


    Quando lo chiudo con la crocetta, l'istanza viene chiusa e per effetto della garbage, la zona di memoria deve essere "ripulita"?
    Quando la applicazione termina, sicuramente ci sarà un cleanup delle risorse ad opera della JVM.

    Alexxandro ha scritto:


    Se invece cambio l'argomento con false, e lancio il file, sul tesk, non c'è traccia del file avviato, neanche su app. in backGround.
    Ma in realtà, il file dovrebbe stare li fermo in memoria, e gieare in teoria in backGround.
    No.
    Se metti true, il main() termina SUBITO ma siccome il framework si accorge che una finestra è diventata si dice displayable (ovvero visualizzabile) grazie al setVisible(true), la JVM NON termina ma continua la esecuzione e sarà il Event Dispatch Thread a portare avanti la gestione della finestra. La JVM terminerà appena non ci sono più finestre visibili.
    Se metti false, il main() termina SUBITO e siccome non ci sono finestre displayable, anche la JVM termina SUBITO.

    Se non hai problemi con l'inglese, leggi:
    AWT Threading Issues

    Lì lo spiega in modo completo.
  • Re: Static, instanza

    Alexxandro ha scritto:
    ed occupa un area di memoria distinta che è uguale all'area occupata dalla sua definizione,nella classe.
    Qui intendo dire che OGGETTO E CLASSE, occupano la stessa quantita di memoria, ma su due aree distinte.
    In teoria se una classe occupa 2 byte, l'oggetto istanziato dalla sua definizione, occuperà 2 byte, essendo una copia fedele della classe
  • Re: Static, instanza

    Alexxandro ha scritto:


    OGGETTO E CLASSE, occupano la stessa quantita di memoria, ma su due aree distinte.
    No, non "la stessa quantità"! La definizione di una classe è molto più complessa, ci sono tutte le informazioni su metodi, campi, ecc.. insomma tutte le varie informazioni che sono tra l'altro anche ottenibili tramite "reflection".

    Alexxandro ha scritto:


    In teoria se una classe occupa 2 byte, l'oggetto istanziato dalla sua definizione, occuperà 2 byte, essendo una copia fedele della classe
    No.
Devi accedere o registrarti per scrivere nel forum
11 risposte