Visualizzazione dei risultati da 1 a 7 su 7
  1. #1
    Utente di HTML.it
    Registrato dal
    Nov 2014
    Messaggi
    55

    [JAVA] Metodo e variabile necessariamente static, perchè?

    Perché in questo codice il metodo m e la variabile x devono essere necessariamente static? non dovrebbe essere una scelta totalmente arbitraria?

    codice:
    public class B {
    private static int x = 1;
    static final void m(int i) {
    i++; x++;
    }
    public static void main(String[] args){
    int y = 1;
    m(y);
    System.out.println(x + " " + y);
    }
    }
    basta che tolgo lo static da una sola tra x ed m e il codice non funziona. Non riesco a spiegarmelo

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da Lodin Visualizza il messaggio
    basta che tolgo lo static da una sola tra x ed m e il codice non funziona. Non riesco a spiegarmelo
    Se togli static dalla dichiarazione di "x", la variabile diventa "di istanza". E NON può essere acceduta implicitamente in un metodo static come il "m". Nei metodi statici NON esiste il this.

    Se togli static dalla dichiarazione del metodo "m", il metodo diventa "di istanza". Esso PUO' usare la variabile static "x" ma essendo il metodo di istanza, NON può essere invocato implicitamente dal main, poiché idem lì non c'è il this e non hai creato alcuna istanza di B.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Utente di HTML.it
    Registrato dal
    Nov 2014
    Messaggi
    55
    ok, ho capito il problema del metodo m. Se proprio non lo si vuole fare statico, deve essere richiamato in questo modo:

    codice:
    public class B {
     int x = 1;
    void m(int i) {
    i++; x++;
    }
    
    
    public static void main(String[] args){
    int y = 1;
    B b = new B();
    b.m(y);
    System.out.println(x + " " + y);
    }
    }
    (non avevo notato il modo in cui veniva chiamato). Ora però continuo a non capire perché x debba essere per forza statico.
    è una variabile come tante altre, usata in un metodo come tanti altri...

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da Lodin Visualizza il messaggio
    Ora però continuo a non capire perché x debba essere per forza statico.
    Ma infatti non è che deve per forza essere static. Dipende dal senso e uso che ne intendi fare!
    Un membro static ("di classe") è associato alla classe ed è sostanzialmente "unico". Un membro non static ("di istanza") è associato distintamente a ciascun oggetto di quella classe.

    Se quel x è statico, il "conteggio" con quel incremento è unico, "globale". Se x è non static, è associato a ciascun oggetto di tipo B. Un oggetto B potrebbe avere x=5, un altro x=10 ecc...


    E tra l'altro, già che ci sono, quel i++ nel m() semplicemente NON serve a nulla. Incrementare il parametro NON cambia ciò che ha il chiamante. Incrementare il parametro i in sostanza non cambia quella variabile y nel main.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    Utente di HTML.it
    Registrato dal
    Nov 2014
    Messaggi
    55
    Quote Originariamente inviata da andbin Visualizza il messaggio
    Ma infatti non è che deve per forza essere static. Dipende dal senso e uso che ne intendi fare!
    Un membro static ("di classe") è associato alla classe ed è sostanzialmente "unico". Un membro non static ("di istanza") è associato distintamente a ciascun oggetto di quella classe.

    Se quel x è statico, il "conteggio" con quel incremento è unico, "globale". Se x è non static, è associato a ciascun oggetto di tipo B. Un oggetto B potrebbe avere x=5, un altro x=10 ecc...


    E tra l'altro, già che ci sono, quel i++ nel m() semplicemente NON serve a nulla. Incrementare il parametro NON cambia ciò che ha il chiamante. Incrementare il parametro i in sostanza non cambia quella variabile y nel main.
    però se compilo il codice del mio ultimo messaggio mi viene fuori questo errore:
    Cannot make a static reference to the non-static field x
    risolvibile mettendo x statico.

    P.S Non considerare il senso del codice... quello iniziale del primo post è il testo di un esercizio quindi non ha molto senso

  6. #6
    Utente di HTML.it
    Registrato dal
    Oct 2014
    residenza
    Padova
    Messaggi
    361
    Nel tuo esempio il fatto che x debba essere statico è causato dal fatto che tenti di stamparlo a video all'interno del main, che è un metodo appunto statico e slegato da qualsiasi istanza della classe B.

    Se quel print fosse all'interno del metodo m il compilatore non darebbe errore, perché all'interno del metodo m (di istanza) quel x sarebbe implicitamente this.x, con il this riferito all'istanza su cui il metodo è richiamato (nel tuo caso quel B b che crei poco prima).

    Ma nel metodo main quel x viene interpretato come B.x (NomeClasse.variabile è il modo "completo" per riferirsi a una variabile statica, nella classe stessa però è superfluo scrivere il nome della classe, allo stesso modo il this riferito a un'istanza è superfluo all'interno della stessa, sempre che non ci sia un altro parametro con lo stesso nome), perché sei in un contesto che è appunto statico. Se volevi stampare a video il valore dell'intero x dell'oggetto b allora dentro al main puoi riferirti direttamente a quel campo con b.x (sempre che il livello di visibilità lo consenta ovviamente).
    Se invece volevi stampare un valore x proprio della classe e non di una particolare istanza... beh lo rendi appunto static!

    Il fatto che poi sia considerato un buon design o meno è tutta un'altra cosa (tipicamente metodi/variabili static devono avere una valida motivazione nella programmazione ad oggetti).
    Ultima modifica di Ansharja; 31-01-2017 a 21:27

  7. #7
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da Lodin Visualizza il messaggio
    risolvibile mettendo x statico.
    Oppure mettendo b.x nel println invece che solo x.
    Il punto non è l'uno o l'altro modo ma perché ti dovrebbe servire x come static piuttosto che non static.

    Ho già spiegato prima la questione di static/non-static. Dipende dove serve l'uno piuttosto che l'altro. E detto in generale, static NON va mai messo solamente perché "ti fa comodo" accedere ad un certo membro. Non è quello l'obiettivo in Java e nei linguaggi ad oggetti.

    Quote Originariamente inviata da Lodin Visualizza il messaggio
    P.S Non considerare il senso del codice... quello iniziale del primo post è il testo di un esercizio quindi non ha molto senso
    Sì, naturalmente.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

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.