Ambito variabile in Java

1. Panoramica

In Java, come in qualsiasi linguaggio di programmazione, ogni variabile ha un ambito. Questo è il segmento del programma in cui una variabile può essere utilizzata ed è valida.

In questo tutorial, introdurremo gli ambiti disponibili in Java e discuteremo le differenze tra loro.

2. Scopo della classe

Ogni variabile dichiarata all'interno delle parentesi di una classe ( {} ) con modificatore di accesso privato ma al di fuori di qualsiasi metodo, ha un ambito di classe. Di conseguenza, queste variabili possono essere utilizzate ovunque nella classe, ma non al di fuori di essa :

public class ClassScopeExample { private Integer amount = 0; public void exampleMethod() { amount++; } public void anotherExampleMethod() { Integer anotherAmount = amount + 4; } }

Possiamo vedere che ClassScopeExample ha una quantità di variabile di classe a cui è possibile accedere all'interno dei metodi della classe.

Se non usiamo private , sarà accessibile dall'intero pacchetto. Controlla l'articolo sui modificatori di accesso per ulteriori informazioni.

3. Ambito del metodo

Quando una variabile viene dichiarata all'interno di un metodo, ha uno scope del metodo e sarà valida solo all'interno dello stesso metodo:

public class MethodScopeExample { public void methodA() { Integer area = 2; } public void methodB() { // compiler error, area cannot be resolved to a variable area = area + 2; } }

In methodA , abbiamo creato una variabile di metodo chiamata area . Per questo motivo, possiamo usare l' area all'interno del metodoA , ma non possiamo usarla da nessun'altra parte.

4. Loop Scope

Se dichiariamo una variabile all'interno di un ciclo, avrà un ambito di ciclo e sarà disponibile solo all'interno del ciclo:

public class LoopScopeExample { List listOfNames = Arrays.asList("Joe", "Susan", "Pattrick"); public void iterationOfNames() { String allNames = ""; for (String name : listOfNames) { allNames = allNames + " " + name; } // compiler error, name cannot be resolved to a variable String lastNameUsed = name; } }

Possiamo vedere che il metodo iterationOfNames ha una variabile di metodo chiamata nome . Questa variabile può essere utilizzata solo all'interno del ciclo e non è valida al di fuori di esso.

5. Portata della staffa

Possiamo definire ambiti aggiuntivi ovunque usando le parentesi ( {} ):

public class BracketScopeExample { public void mathOperationExample() { Integer sum = 0; { Integer number = 2; sum = sum + number; } // compiler error, number cannot be solved as a variable number++; } }

Il numero variabile è valido solo tra parentesi.

6. Scopes e Variable Shadowing

Immagina di avere una variabile di classe e di voler dichiarare una variabile di metodo con lo stesso nome:

public class NestedScopesExample { String title = "Baeldung"; public void printTitle() { System.out.println(title); String title = "John Doe"; System.out.println(title); } }

La prima volta che stampiamo il titolo , verrà stampato "Baeldung". Successivamente, dichiarare una variabile di metodo con lo stesso nome e assegnarle il valore "John Doe ".

La variabile del metodo title sovrascrive la possibilità di accedere nuovamente alla variabile di classe title . Ecco perché la seconda volta verrà stampato "John Doe " .

Confuso, vero? Questo è chiamato shadowing variabile e non è una buona pratica. È meglio usare il prefisso this per accedere alla variabile della classe title , come this.title .

7. Conclusione

Abbiamo appreso i diversi ambiti che esistono in Java.

Come sempre, il codice è disponibile su GitHub.