Visualizzazione dei risultati da 1 a 9 su 9

Discussione: Comprensione di static

  1. #1

    Comprensione di static

    Ciao a tutti, vorrei cercare di capire bene cosa si intende quando si dichiara qualcosa di static, sulle slides del mio prof. ho trovato scritto:

    " Un metodo static non richiede l'instanziazione di un oggetto della classe per il suo utilizzo"

    Cosa significa ciò ? Non riesco bene a capirlo!!!

    Grazie!!!
    L'impossibile richiede solo più tempo...

  2. #2

    Re: Comprensione di static

    Originariamente inviato da minidiable
    " Un metodo static non richiede l'instanziazione di un oggetto della classe per il suo utilizzo"
    Cioè, un metodo statico viene invocato sulla classe e non su una istanza di quella classe.
    Quindi è importante conoscere la differenza tra classe ed istanza di classe, campi di classe e campi di istanza, metodi di classe e metodi di istanza.

  3. #3
    Cioè?

    Quando scrivo static lo posso fare solo quando definisco una classe e non in una istanza di una classe?

    Non ho ancora capito bene!!!
    L'impossibile richiede solo più tempo...

  4. #4
    Originariamente inviato da minidiable
    Quando scrivo static lo posso fare solo quando definisco una classe e non in una istanza di una classe?
    Se ad esempio hai questa classe:
    codice:
    public class Classe{
             private static int campoStatico;
             private int campoIstanza;
    
             static{
                    campoStatico = 0;
             }
    
             public Classe(){
                    this.campoIstanza = ++campoStatico;
             }
    
             public static int getCampoStaticoClasse(){
                      return campoStatico;
             }
    
             public int getCampoThisIstanza(){
                     return this.campoIstanza;
             }
    }
    Per invocare il metodo getCampoStaticoClasse devi fare così:
    codice:
    Classe.getCampoStaticoClasse();
    invece, per invocare il metodo getCampoThisIstanza, devi istanziare Classe e quindi fare in questo modo:
    codice:
    Classe istanza = new Classe();
    istanza.getCampoThisIstanza();

  5. #5
    Utente di HTML.it L'avatar di Dark867
    Registrato dal
    Mar 2010
    Messaggi
    435
    Che prof. ignorante, spiega solo l'applicazione pratica senza far capire cosa stai facendo davvero con static.

    In java puoi dichiarare sia variabili, sia metodi, sia addirittura classi static.

    Scrivendo static vicino a una variabile o a un metodo tu fai appartenere quella variabile/metodo alla classe, non agli oggetti il che significa pure, capovolgendo il discorso, che quel metodo/variabile apparterrà a tutti gli oggetti di quella classe.

    Ad esempio, per le variabili, supponi di definire la classe:
    codice:
    public class ProvaStatic{
    
    private static int a;
    
    public ProvaStatic(){
        a=0;
    }
    
    public void setStatic(){
       a++;
    }
    
    public int getStatic(){
      return a;
    }
    
    public static void main(String[] args){
         ProvaStatic prova1 = new ProvaStatic(); //oggetto 1
    	 ProvaStatic prova2 = new ProvaStatic(); //oggetto 2
    	 
    	 prova1.setStatic();
    	 
    	 System.out.println(prova2.getStatic()); //che valore verra' visualizzato?
    	 
    }
    
    }
    Se esegui questo programma ti uscirà 1 come valore: a è stato incrementato dall'oggetto prova1 eppure richiamando get da prova2 te lo ritrovi incrementato!
    Se invece rimuovi la parola chiave static da a vedrai che ti uscirà zero.
    Che significa questo? Che mentre senza static il compilatore crea una variabile a per ogni oggetto della classe, con static la variabile a è condivisa oltre che presente fin da subito quando definisci la classe.

    Con i metodi capita più o meno la stessa cosa: il metodo esiste nel momento in cui definisci la classe, quindi lo puoi richiamare anche senza instanziare nessun oggetto della classe medesima come già ti hanno fatto vedere.

    Attenzione a usare variabili/metodi static perché, essendo questi creati a prescindere dall'instanziazione o meno degli oggetti, vanno a occupare da subito spazio in memoria e il tuo programma crescerà di dimensioni.

  6. #6
    Originariamente inviato da Dark867
    Ad esempio, per le variabili, supponi di definire la classe:
    codice:
    public class ProvaStatic{
    
    private static int a;
    
    public ProvaStatic(){
        a=0;
    }
    
    public void setStatic(){
       a++;
    }
    
    public int getStatic(){
      return a;
    }
    
    public static void main(String[] args){
         ProvaStatic prova1 = new ProvaStatic(); //oggetto 1
    	 ProvaStatic prova2 = new ProvaStatic(); //oggetto 2
    	 
    	 prova1.setStatic();
    	 
    	 System.out.println(prova2.getStatic()); //che valore verra' visualizzato?
    	 
    }
    
    }
    Secondo lo stile e le convenzioni della programmazione OO ciò che hai scritto non è previsto e genera confusione: accedi con metodi di istanza a campi di classe!!
    Proprio perchè si tratta di campi di classe (statici), a questi si deve accedere non istanziando alcun oggetto, ma specificando il nome della classe ed invocando su questo, ad esempio, opportuni operatori/metodi di classe.

    E' come se tu entrassi in un edificio da una finestra, anzichè dalla porta.

  7. #7
    Utente di HTML.it L'avatar di Dark867
    Registrato dal
    Mar 2010
    Messaggi
    435
    Lo so, il mio era un esempio prettamente didattico per dimostrare come l'esecuzione di un metodo anche di istanza su una variabile statica potesse avere consequenze "strane".

    La regola è "le variabili statiche dovrebbero essere accedute solo tramite metodi statici, che a loro volta dovrebbero essere acceduti solo da classi e non da instanze".

  8. #8
    Originariamente inviato da Dark867
    La regola è "le variabili statiche dovrebbero essere accedute solo tramite metodi statici".
    Appunto. Nel tuo esempio ciò non viene rispettato..

  9. #9
    Utente di HTML.it L'avatar di Dark867
    Registrato dal
    Mar 2010
    Messaggi
    435
    ...e ho spiegato perchéxD
    Grazie per aver fatto notare questa cosa comunque, effettivamente è bene farla presente.

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.