"Il professore non riesce proprio a uscire dalla sua routine. I vecchi insegnanti abituati a tenere lezioni sono sempre così. Non c'è niente che possa dirti che non puoi trovare nei libri. Non impari a nuotare ascoltando alle lezioni di nuoto. Le lezioni sono utili solo quando hai familiarità con l'argomento e ne sai quasi quanto il tuo professore."

"Tuttavia, le sue lezioni sono utili."

"Sì. Voglio dire, speriamo che lo siano. Più prospettive sull'argomento ascolti, più ti avvicinerai alla verità. Quando ne ascolti solo una, tutto ciò che puoi fare è crederci o non crederci. OK, andiamo tornare al lavoro".

"Diamo un'occhiata a una foto che ti ho mostrato prima."


public class Variables

{
   private static String TEXT = "The end.";
  ┗━━━━━━━━━━━━━━━━━━━┛
   public static void main (String[] args)
                          ┗━━━━━━━┛
  {
     System.out.println("Hi");
     String s = "Hi!";
   ┏┗━━━━┛
    System.out.println(s);
    if (args != NULL)
    {
       String s2 = s;
      ┗━━━━┛
   
      System.out.println(s2);
     
    }
    Variables variables = new Variables();
    System.out.println(variables.instanceVariable);
    System.out.println(TEXT);
   
  }
 
   public String instanceVariable;
  ┗━━━━━━━━━━━━━━━┛
   public Variables()
   {
      instanceVariable = "Instance variable test.";
   }
}

1. Una variabile dichiarata in un metodo esiste (è visibile) dall'inizio della sua dichiarazione alla fine del metodo.

2. Una variabile dichiarata in un blocco di codice esiste fino alla fine del blocco di codice.

3. I parametri di un metodo esistono finché il metodo non ritorna.

4. Le variabili in un oggetto esistono durante l'intero ciclo di vita dell'oggetto che le contiene. La loro visibilità è regolata anche da speciali modificatori di accesso.

5. Le variabili statiche (di classe) esistono per tutto il tempo in cui il programma è in esecuzione. La loro visibilità è definita anche dai modificatori di accesso."

"Giusto. Ricordo questa foto."

"Fantastico. Lascia che ti ricordi alcuni punti chiave."

"Tutte le variabili dichiarate all'interno dei metodi esistono (sono visibili) dal punto in cui sono dichiarate fino alla fine del metodo (Esempio 1)."

"Se una variabile è dichiarata in un blocco di codice, esiste fino alla fine del blocco di codice (Esempio 2)."

"Se una variabile è un parametro di metodo, esiste (è visibile) nell'intero corpo del metodo (Esempio 3)."

"Se una variabile è una variabile di istanza (Esempio 4), è collegata a un determinato oggetto ed esiste finché esiste l'oggetto. Se non esiste alcun oggetto, allora non ci sono istanze della variabile. È possibile accedere alla variabile (ad es. la variabile è visibile) da tutti i metodi della classe, indipendentemente dal fatto che siano stati dichiarati prima o dopo di essa. Viene creata una nuova variabile per ogni oggetto. È indipendente da altri oggetti. Non è possibile accedere a una variabile di istanza da metodi statici . "

"Se una variabile è dichiarata statica, cioè contrassegnata con la parola chiave static , esiste finché esiste la sua classe. La JVM di solito carica una classe in memoria al suo primo utilizzo. Questo è anche il momento in cui le variabili statiche vengono inizializzate."

Ulteriori informazioni sull'ambito variabile - 1

"L'esempio sopra dichiara la classe Cat, che ha quattro variabili: a, b, s (variabili non statiche) e count (una variabile statica). Se creiamo diversi oggetti di questa classe (diciamo tre), ciascuno di conterranno le proprie istanze delle variabili non statiche della classe. Una variabile statica è condivisa da tutti gli oggetti di una classe. Tecnicamente parlando, non è nemmeno all'interno di questi oggetti, poiché esisteva anche prima della creazione di qualsiasi oggetto Cat."

"Ecco cosa succede se dichiariamo una variabile sstatica:"

Ulteriori informazioni sull'ambito variabile - 2

"OK. Penso di aver capito."

"Puoi dichiarare variabili con lo stesso nome?"

"Non all'interno di un metodo. Tutte le variabili dichiarate all'interno di un metodo devono avere nomi univoci. Anche gli argomenti di un metodo sono considerati variabili locali."

"E le variabili membro?"

"Anche le variabili membro devono essere univoche per ogni classe."

"Ma c'è un'eccezione: i nomi delle variabili locali e delle variabili membro possono essere identici. "

"Se cambiamo una tale variabile, quale delle due variabili con lo stesso nome verrà modificata?"

"Se nel nostro codice sono presenti diverse variabili visibili (accessibili), ad esempio una variabile di istanza e una variabile locale, si accederà alla variabile locale."

Esempio con due variabili count
class Main
{
    public int count = 0;     // Declare an instance variable

    public void run()
    {
        count = 15;           // Access the instance variable
        int count = 10;       // Declare a local method variable
        count++;             // Access the method variable
    }
}

"Questo codice dichiara due variabili count. La riga 3 dichiara una variabile di istanza e la riga 8 una variabile locale ."

"Ecco cosa succede quando viene eseguito il metodo run:"

"Nella riga 7, accediamo alla variabile di istanza e le assegniamo il valore 15"

"Nella riga 8, dichiariamo (creiamo) una nuova variabile locale : count. Maschera la variabile di istanza. La variabile locale è ciò che vedrà (accesso) tutto il codice successivo nel metodo."

"Fatto."

"La variabile locale maschera la variabile di istanza. In altre parole, la variabile locale è quella a cui accedere. Tuttavia, puoi accedere anche alla variabile di istanza. È solo un po' più complicato farlo."

Variabile statica (di classe).
ClassName.variableName

// Here are some examples:
Cat.catsCount
Variabile (istanza) non statica
this.variableName

// Here are some examples:
this.catsCount

"Cos'altro puoi dirmi sui metodi statici e sulle variabili statiche?"

"I metodi statici e le variabili non sono legati agli oggetti della classe, sono legati alla classe stessa. Se creiamo dieci oggetti Variables (vedi l'esempio all'inizio di questo livello), avremo dieci variabili instanceVariable (una per ogni oggetto) e una sola variabile condivisa (statica) TEXT ."

"Ho una domanda."

"Qual è la differenza tra metodi statici e non statici?"

"Diamo un'occhiata a come funziona un metodo non statico:"

Come appare il codice
Cat cat = new Cat();
String name = cat.getName();
cat.setAge(17);
cat.setChildren(cat1, cat2, cat3);
Cosa succede davvero
Cat cat = new Cat();
String name = Cat.getName(cat);
Cat.setAge(cat,17);
Cat.setChildren(cat, cat1, cat2, cat3);

"Quando chiami un metodo usando <object> dot <method name> , in realtà stai chiamando un metodo di classe e passando lo stesso oggetto come primo argomento. All'interno del metodo, l'oggetto è chiamato 'this' . Tutte le operazioni nel metodo vengono eseguiti su questo oggetto e i relativi dati."

"Wow! Quindi è così che funziona!"

"Ed è così che funziona un metodo statico."

Come appare il codice
Cat cat1 = new Cat();
Cat cat2 = new Cat();
int catCount = Cat.getAllCatsCount();
Cosa succede davvero
Cat cat1 = new Cat();
Cat cat2 = new Cat();
int catCount = Cat.getAllCatsCount(null);

"Quando chiami un metodo statico, non gli viene passato alcun oggetto. In altre parole, 'this' è uguale a null . Ecco perché un metodo static non può accedere a variabili e metodi non statici (poiché non ha 'this' da passare a questi metodi)."

"Hmmm. Credo di aver capito. Almeno un po'."

"Ed ecco lo zio Diego... ei suoi compiti."