Ambito Java in generale
Perché è necessario separare gli ambiti delle variabili e dei metodi? Il fatto è che a volte i programmi sono molto grandi e può essere difficile tenere traccia dell'una o dell'altra variabile. Inoltre, nei progetti di grandi dimensioni, è auspicabile una chiara denominazione delle variabili in modo che sia chiaro a cosa servono. Scope consente specificamente di avere diverse variabili con lo stesso nome in diverse parti del programma. Tale codice è più facile da mantenere e leggere. L'ambito Java definisce dove una determinata variabile o metodo è accessibile in un programma. Brevemente:- Una variabile dichiarata in un metodo è visibile dall'inizio della dichiarazione alla fine del metodo (ambito del metodo).
- Una variabile dichiarata in un blocco di codice esiste fino alla fine di quel blocco di codice.
- Le variabili che sono argomenti del metodo esistono fino alla fine del metodo.
- Le variabili di classe/oggetto esistono per la durata dell'oggetto contenitore. La loro visibilità è regolata da speciali modificatori di accesso.
- Le variabili di classe statiche esistono per tutto il tempo in cui il programma è in esecuzione. La loro visibilità è determinata anche dai modificatori di accesso.
Ambito a livello di metodo
Qualsiasi variabile dichiarata in un metodo, inclusi gli argomenti, non è accessibile al di fuori di tale metodo. Tutte le variabili dichiarate all'interno dei metodi sono visibili dall'inizio della loro dichiarazione alla fine del metodo. Ecco un esempio di ambito variabile del metodo:
public class JScopeTest1 {
public static void main(String[] args) {
System.out.println(myMethod(5));
System.out.println(myMethod(17));
}
public static int myMethod(int arg) {
int secondArg = 100; //local method variable
return secondArg + arg;
}
}
Qui abbiamo secondArg , una variabile locale o un argomento del metodo. Non possiamo usare questa variabile al di fuori del metodo myMethod o prima che fosse dichiarata. Se una variabile è un argomento di funzione, allora è visibile nell'intero corpo di questo metodo. Nell'esempio sopra abbiamo due di questi argomenti: arg in myMethod e args nel metodo principale.
Ambito a livello di classe
Ambito a livello di classe (variabili di istanza): qualsiasi variabile dichiarata in una classe è disponibile per tutti i metodi di quella classe. A seconda del suo modificatore di accesso (cioè pubblico o privato), a volte è possibile accedervi al di fuori della classe. Quindi, se una variabile è una variabile di classe, allora è legata a un oggetto specifico ed esiste finché esiste un oggetto di questa classe. Se non c'è oggetto, allora non c'è copia della variabile. La variabile è visibile da tutti i metodi della classe, indipendentemente dal fatto che siano stati dichiarati prima o dopo di essa. Ogni oggetto ha la sua variabile indipendente da altri oggetti. L'accesso a una variabile da metodi statici non è possibile.Esempio di codice
public class Student {
//class level variables
public String surname;
String name;
String secondName;
private Long birthday; // Long instead of long is used by Gson/Jackson json parsers and various orm databases
public Student(String surname, String name, String secondName, Date birthday ){
this.surname = surname;
this.name = name;
this.secondName = secondName;
this.birthday = birthday == null ? 0 : birthday.getTime();
}
@Override
public int hashCode(){
//TODO: check for nulls
//return surname.hashCode() ^ name.hashCode() ^ secondName.hashCode() ^ (birthday.hashCode());
return (surname + name + secondName + birthday).hashCode();
}
@Override
public boolean equals(Object other_) {
Student other = (Student)other_;
return (surname == null || surname.equals(other.surname) )
&& (name == null || name.equals(other.name))
&& (secondName == null || secondName.equals(other.secondName))
&& (birthday == null || birthday.equals(other.birthday));
}
}
Surname , name , secondName e birthday sono variabili di istanza.
Ambito di blocco
Se una variabile è definita/dichiarata in un blocco di codice, esiste fino alla fine di quel blocco di codice. Tipicamente, tali variabili esistono tra le parentesi graffe in cui sono definite. Molto spesso l'ambito del blocco potrebbe essere una variabile di ciclo. Una variabile dichiarata in una condizione del ciclo for non è accessibile al di fuori del ciclo, a meno che non sia stata definita in precedenza.
public class JScopeTest2 {
public static void main(String[] args) {
for (int i = 0; i < 10; i++) {
int sum = 0;
sum = sum + i;
}
int sum = 1;
System.out.println(sum);
}
}
Sia la prima somma che le variabili i sono dichiarate all'interno del ciclo e non esistono al di fuori di questo ciclo. Tuttavia la seconda somma è stata dichiarata fuori dal ciclo, quindi questa particolare variabile verrà stampata.
Variabili statiche
Se una variabile è dichiarata come statica (contrassegnata con la parola chiave static), esiste finché esiste la sua classe. In genere, la JVM carica una classe in memoria al primo utilizzo, quando vengono inizializzate le variabili statiche.
import java.util.Date;
public class Student {
public static int today = 2022;
String surname;
String name;
String secondName;
Long birthday; // Long instead of long is used by Gson/Jackson json parsers and various orm databases
public Student(String surname, String name, String secondName, Date birthday ){
this.surname = surname;
this.name = name;
this.secondName = secondName;
this.birthday = birthday == null ? 0 : birthday.getTime();
}
public static void main(String[] args) {
System.out.println(today);
}
}
Non dovresti creare una nuova istanza della classe Student per utilizzare la variabile static today . Qui verrà stampato “2022”.
Modificatori di accesso
Java ha 4 modificatori di accesso per limitare l'accesso al metodo o alla variabile. Puoi usarli all'interno delle classi, non all'interno dei metodi.-
private è il modificatore più restrittivo. Limita l'accesso a metodi e variabili alla classe in cui sono stati dichiarati. Se non è necessario utilizzare determinati metodi o variabili al di fuori della classe, utilizzare private. Le variabili di classe sono generalmente private in Java.
-
Se non viene specificato alcun modificatore di accesso, il metodo o la variabile accetterà il modificatore predefinito . default consente l'accesso solo dal pacchetto corrente.
-
Il modificatore protected consente l'accesso a un metodo oa una variabile solo dall'interno del pacchetto corrente, a meno che non vi si acceda tramite una classe figlia esterna al pacchetto.
-
public è il modificatore meno restrittivo. Ti permette di accedere a una classe, metodo o variabile non solo dalla classe in cui sono dichiarati, ma anche dall'esterno. Questo modificatore è usato molto spesso.
GO TO FULL VERSION