Visualizzazione dei risultati da 1 a 6 su 6

Hybrid View

  1. #1
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Ok, ora mi sono ricordato, mi ricordavo la regola del forward reference.
    Lo segno qui, così può essere utile:

    Questo è legale e corretto:

    codice:
    public class Prova {
        private static int svar1;
    
        static {
            svar1 = 10;
            svar2 = 20;
        }
    
        private static int svar2;
    
        public static void main(String[] args) {
            System.out.println(svar1);
            System.out.println(svar2);
        }
    }

    Stampa 10 e 20.

    Se però svar2 ha una inizializzazione:

    codice:
    public class Prova {
        private static int svar1;
    
        static {
            svar1 = 10;
            svar2 = 20;
        }
    
        private static int svar2 = 100;    // Inizializzazione
    
        public static void main(String[] args) {
            System.out.println(svar1);
            System.out.println(svar2);
        }
    }

    allora l'assegnamento svar2 = 20; è inutile, poiché l'inizializzazione a 100 avviene comunque DOPO. Pertanto stampa 10 e 100.


    Quello che è illegale (e dà errore) è un forward reference (non qualificato):

    codice:
    public class Prova {
        private static int svar1;
    
        static {
            svar1 = svar2;
        }
    
        private static int svar2 = 10;
    
        public static void main(String[] args) {
            System.out.println(svar1);
            System.out.println(svar2);
        }
    }

    Su svar1 = svar2; il javac segnala l'errore "illegal forward reference". Ovvero così non può accedere ad una variabile che è testualmente dopo.

    Se però qualifichi l'uso di svar2 con il nome della classe:

    codice:
    public class Prova {
        private static int svar1;
    
        static {
            svar1 = Prova.svar2;   // svar2 qualificato
        }
    
        private static int svar2 = 10;
    
        public static void main(String[] args) {
            System.out.println(svar1);
            System.out.println(svar2);
        }
    }
    Allora per il compilatore è lecito e compila. Ma poi a runtime a svar1 viene assegnato 0, perché in quel momento svar2 è ancora a 0, la inizializzazione a 10 avverrà solo DOPO.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  2. #2
    Utente di HTML.it
    Registrato dal
    Apr 2014
    Messaggi
    76
    Quote Originariamente inviata da andbin Visualizza il messaggio
    Ok, ora mi sono ricordato, mi ricordavo la regola del forward reference.
    Lo segno qui, così può essere utile:

    Questo è legale e corretto:

    codice:
    public class Prova {
        private static int svar1;
    
        static {
            svar1 = 10;
            svar2 = 20;
        }
    
        private static int svar2;
    
        public static void main(String[] args) {
            System.out.println(svar1);
            System.out.println(svar2);
        }
    }

    Stampa 10 e 20.

    Se però svar2 ha una inizializzazione:

    codice:
    public class Prova {
        private static int svar1;
    
        static {
            svar1 = 10;
            svar2 = 20;
        }
    
        private static int svar2 = 100;    // Inizializzazione
    
        public static void main(String[] args) {
            System.out.println(svar1);
            System.out.println(svar2);
        }
    }

    allora l'assegnamento svar2 = 20; è inutile, poiché l'inizializzazione a 100 avviene comunque DOPO. Pertanto stampa 10 e 100.


    Quello che è illegale (e dà errore) è un forward reference (non qualificato):

    codice:
    public class Prova {
        private static int svar1;
    
        static {
            svar1 = svar2;
        }
    
        private static int svar2 = 10;
    
        public static void main(String[] args) {
            System.out.println(svar1);
            System.out.println(svar2);
        }
    }

    Su svar1 = svar2; il javac segnala l'errore "illegal forward reference". Ovvero così non può accedere ad una variabile che è testualmente dopo.

    Se però qualifichi l'uso di svar2 con il nome della classe:

    codice:
    public class Prova {
        private static int svar1;
    
        static {
            svar1 = Prova.svar2;   // svar2 qualificato
        }
    
        private static int svar2 = 10;
    
        public static void main(String[] args) {
            System.out.println(svar1);
            System.out.println(svar2);
        }
    }
    Allora per il compilatore è lecito e compila. Ma poi a runtime a svar1 viene assegnato 0, perché in quel momento svar2 è ancora a 0, la inizializzazione a 10 avverrà solo DOPO.
    Grazie mille!!!
    Mmolto esaustivo ed interessante, grazie ancora....

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.