Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 15
  1. #1
    Utente di HTML.it
    Registrato dal
    Oct 2002
    Messaggi
    883

    (java) metodi e var statiche

    Non ho capito bene come quand'è che si può definire un metodo di tipo "static"

    Per esempio, supponiamo di avere un editor di testo.
    In questa interfaccia c'è un classe che definirà un:

    JFrame jf;

    che contiene un

    JTextPane editor;

    Poi ci saranno tutta una serie di classi che, ad esempio, si occperanno di:

    creare una menubar
    creare una toolbar
    creare azioni (ad esempio cerca file, seleziona tutto ec...)

    Prendiamo la classe che si occuperà della funzione "salva file"
    In questa classe dovrà comparire una jotionpane che ti permettaa di specificare la directory in cui vuoi salvare il file. Il suo costruttore richiede di specificare il un jframe e io voglio dargli il frame:

    jf

    definito nell'altra classe.
    Ora invece di farmi un oggetto della classe che contiene il jf e poi chiamare il metodo

    getFrame

    posso definire il suddetto metodo di tipo statico in modo che ogni volta che avrò bisono del jframe lo possa richiamare in maniera più semplice?

    nomeClasse.getFrame();

    Stesso discorso per la classe che contiene l'editor. Un sacco di funzioni avranno bisogno del testo contenuto nell'editor
    Invece di istanziare un oggetto della classe e poi richiamare il metodo

    getEditor()

    Posso dichiararlo statico?
    Se lo dichiaro statico anche la variabile editor dovrà essere statica.

    E' corretto?

    Io penso di si perchè avere una variabile statica vuol dire ch la variabile assume lo stesso valore in ognuna delle istanze create della classe che lo contiene, ed infatti la variabile editor deve essere uguale in qualunque parte del programma venga usato

    Mi servono delle delucidazioni :-D

  2. #2
    Utente di HTML.it
    Registrato dal
    Oct 2002
    Messaggi
    883
    .

  3. #3
    Utente di HTML.it
    Registrato dal
    Jan 2002
    Messaggi
    633
    premetto che sto studiando java da poco...cmq...

    A livello di design di programmazione, devi pensare ai metodi static come alle funzioni globali in C, ovvero metodi che hanno una valenza globale, non legati a particolari istanze di una classe, ma al più legati alla classe stessa.

    A livello di implementazione i metodi static si distinguono per:
    1) Sono memorizzati una sola volta (la prima volta che sono chiamati) nella Static Storage area (parte della RAM associata al programma per tutta la durata del programma), una volta inizializzate il loro life-time sarà quindi lo stesso del programma.

    2) Non essendo legate ad alcuna istanza (ma al più alla classe) sono metodi caratterizzati dal fatto che il compilatore non passa loro il "this". Questo ti fa capire come un metodo static non possa chiamare altri metodi che non siano static o non possa accedere a campi non static (se non passati esplicitamente come parametri).

    3) Seppur secondario in Java, il fatto che il compilatore non debba passare implicitamente argomenti alle funzioni static, rende questi metodi leggermente più veloci dei non-static.

    4) il compilatore usa l'"early binding" per questi metodi (come per i final e i private), (d'altronde, visto i punti precedenti...perchè dovrebbe usare late-binding per i metodi static?). Anche quest'aspetto rende i metodi static leggermente più efficienti.

    spero di aver detto tutto giusto, in caso...qualcun'altro mi correga.
    ciauz
    Alcuni miei articoli in PRO.HTML.IT: JavaScript | DHTML | DOM
    Sviluppo : wedev | forum

  4. #4
    Utente di HTML.it
    Registrato dal
    Oct 2002
    Messaggi
    883
    Proviamo a definire un metodo di tipo statico
    Il metodo ritorna una variabile
    Devo dichiarare statica anche la variabile
    La domanda è questa:
    Quando istanzio la classe che contiene il metodo statico la variabile vale 10
    durante l'esecuzione del programma la variabile cambia valore
    E' un problema?

    Non dovrebbe essere un problema, la variabile mica l'ho dichiarata final quindi tutto dovrebbe funzionare, no?

  5. #5
    Utente di HTML.it
    Registrato dal
    Jan 2002
    Messaggi
    633
    se la tua variabile cambia non può essere final.

    Quello che vorrei sottolinearti è che il metodo static, come pure le variabili static, non sono legate ad una o più istanze della classe, ma alla classe stessa.
    Quando chiami il tuo metodo static (lo puoi fare senza dover istanziare la classe) la variabile che ritorna deve essere stata inizializzata (altrimenti hai un valore indefinito..sempre se il compilatore non ti segnala l'errore).
    Quindi la tua variabile deve essere static ed inizializzata prima (o durante) della prima chiamata al metodo static.

    fai conto che "static" significhi : "alloco memoria solo una volta".

    ciauz
    Alcuni miei articoli in PRO.HTML.IT: JavaScript | DHTML | DOM
    Sviluppo : wedev | forum

  6. #6
    Utente di HTML.it
    Registrato dal
    Oct 2002
    Messaggi
    883
    mi potresti fare un esempio di una situazione in cui un metodo non può essere dichiarato statico?

  7. #7
    Utente di HTML.it
    Registrato dal
    Jan 2002
    Messaggi
    633
    Originariamente inviato da abcd1000
    mi potresti fare un esempio di una situazione in cui un metodo non può essere dichiarato statico?
    codice:
    import java.util.*;
    
    public class NoStatic{
    	// ELEMENTI STATIC:
    	static private int initialized = 1;
    	static private int notInitialized; //tipo primitivo inizializzato dal Compilatore a 0 (default value)
    	static private Object objInit = new Object(); // tipo non primitivo inizializzato
    	static private Object objNotInit;  // tipo non primitivo non inizializzato
    
    
    	// ELEMENTI PRIVATE:
    	private int nonStatic = 2;
    	private Object nonStaticObj = new Object();
    	
    	// METODI STATIC: 
    	static public int getInitialized(){return initialized;}
    	static public int getNotInitialized(){return notInitialized;}
    	// static public int getNonStatic(){return nonStatic;} // <- ERRORE
    	// non-static variable nonStatic cannot be referenced from a static context
    	
    	static public String getObjNotInit(){return objNotInit.toString();} 
    	static public String getObjInit(){return objInit.toString();} 
    	// static public String getNonStaticObj(){return nonStaticObj.toString();} 
    	// non-static variable nonStaticObj cannot be referenced from a static context
    	
    	public static void main(String[] args){
    		System.out.println(NoStatic.getInitialized());
    		System.out.println(NoStatic.getNotInitialized());
    		System.out.println(NoStatic.getObjInit());
    		System.out.println(NoStatic.getObjNotInit()); // <- ERRORE: tipo non primitivo non inizializzato
    		}	
    }
    Alcuni miei articoli in PRO.HTML.IT: JavaScript | DHTML | DOM
    Sviluppo : wedev | forum

  8. #8
    Utente di HTML.it
    Registrato dal
    Oct 2002
    Messaggi
    883
    aspetta provo a farti un esempio io

    ho due classi

    SaveFile e CompileFile

    La classe SaveFile ha il metodo save() che serve a salvare file di testo (quindi quando lo usi si apre una joptionpanel dove specifichi dove salvare il file e con che nome)

    La classe CompileFile ha il metodo compile() e vorrebbe usare il metodo save() della classe SaveFile.

    Posso dichiarare static il metodo save della classe SaveFile?

  9. #9
    Utente di HTML.it
    Registrato dal
    Jan 2002
    Messaggi
    633
    da quel ho capito, sì.
    Dichiarare save come static non impedisce ad un metodo di un'altra classe di chiamarlo, ma impedisce al metodo save di accedere agli elementi non static della sua classe.

    Se non ti è chiaro, prova a mettere giù un po di codice.
    ciauz
    Alcuni miei articoli in PRO.HTML.IT: JavaScript | DHTML | DOM
    Sviluppo : wedev | forum

  10. #10
    Utente di HTML.it
    Registrato dal
    Oct 2002
    Messaggi
    883
    thx
    il mio problema è che, nel mio programma, mi sembra di poter dichiarare tutto statico
    non riesco a farmi un esempio in cui non potrei farlo

    io ho tutti metodi del tipo

    compileFile
    runFile
    saveFile
    searchWordInFile

    ecc..

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.