AFF Education Construa seu Futuro

Aula 14 - Variáveis Local e global

Variáveis global e local

Imagine um código com o bloco maior e outros blocos menores dentro do bloco maior.

As variáveis globais são criadas no bloco maior (maior escopo) e podem ser usadas em todos os blocos (no maior e menor).

As variáveis locais são criadas apenas no bloco menor (menor escopo) e só podem ser usadas no bloco menor.

Se você tentar usar uma variável local fora do seu escopo (do seu bloco menor), vai dar erro de compilação.

Erro no código: variável local fora do escopo

public class variaveisLocalEGlobal {
    public static void main(String[] args) {
        // Variáveis no bloco maior
        int idadeGlobal = 10;
        String nomeGlobal = "Jorge";

        {
            // Criou um bloco dentro de outro bloco (bloco menor)
            // O que criar dentro desse, só vale nesse bloco
            int idadeLocal = 15;
            String nomeLocal = "Maria";
            System.out.println("Nome: " + nomeGlobal + " tem " + idadeGlobal + " anos.");
            System.out.println("Nome: " + nomeLocal + " tem " + idadeLocal + " anos.");
        }

             System.out.println("Nome: " + nomeGlobal + " tem " + idadeGlobal + " anos.");
             System.out.println("Nome: " + nomeLocal + " tem " + idadeLocal + " anos."); // erro de compilação
    }
}

Variáveis global e local

Imagine um código com o bloco maior e outros blocos menores dentro do bloco maior.

As variáveis globais são criadas no bloco maior (maior escopo) e podem ser usadas em todos os blocos (no maior e menor).

As variáveis locais são criadas apenas no bloco menor (menor escopo) e só podem ser usadas no bloco menor.

Se você tentar usar uma variável local fora do seu escopo (do seu bloco menor), vai dar erro de compilação.

Erro no código: variável local fora do escopo

public class variaveisLocalEGlobal {
    public static void main(String[] args) {
        // Variáveis no bloco maior
        int idadeGlobal = 10;
        String nomeGlobal = "Jorge";

        {
            // Criou um bloco dentro de outro bloco (bloco menor)
            // O que criar dentro desse, só vale nesse bloco
            int idadeLocal = 15;
            String nomeLocal = "Maria";
            System.out.println("Nome: " + nomeGlobal + " tem " + idadeGlobal + " anos.");
            System.out.println("Nome: " + nomeLocal + " tem " + idadeLocal + " anos.");
        }

             System.out.println("Nome: " + nomeGlobal + " tem " + idadeGlobal + " anos.");
    }
}

Nome: Jorge tem 10 anos.

Nome: Maria tem 15 anos.

Nome: Jorge tem 10 anos.

Regras de escopo:

Outro exemplo com variáveis local e global

public class EscopoVariaveis {
    public static void main(String[] args) {
        // Variáveis declaradas no escopo do método main
        int numero = 10; // Variável global
        
        // Este bloco cria um novo escopo
        {
            // Variável declarada dentro deste bloco
            int numeroLocal = 20;// Variável local
            
            // Podemos acessar variáveis do escopo exterior
            System.out.println("Dentro do bloco:");
            System.out.println("numero = " + numero);        // Acessível
            System.out.println("numeroLocal = " + numeroLocal);  // Acessível
        }
        
        // Fora do bloco
        System.out.println("\nFora do bloco:");
        System.out.println("numero = " + numero);  // Acessível
        
        // A linha abaixo causaria erro de compilação, pois numeroLocal
        // não está acessível fora do bloco onde foi declarado
        // System.out.println("numeroLocal = " + numeroLocal);  // ERRO!
        
        // Outro exemplo com for
        for (int i = 0; i < 3; i++) {
            System.out.println("\nValor de i no loop: " + i);
            
            // A variável i só existe dentro do escopo do for
            int valorCalculado = i * 100;
            System.out.println("Valor calculado: " + valorCalculado);
        }
        
        // Ambas as linhas abaixo causariam erro de compilação
        // System.out.println("i fora do loop: " + i);  // ERRO!
        // System.out.println("valorCalculado: " + valorCalculado);  // ERRO!
    }
}

Dentro do bloco:

numero = 10

numeroLocal = 20

Fora do bloco:

numero = 10

Valor de i no loop: 0

Valor calculado: 0

Valor de i no loop: 1

Valor calculado: 100

Valor de i no loop: 2

Valor calculado: 200

Exercícios

Teste seus conhecimentos sobre variáveis locais e globais (campos) em Java:

1. Sobre escopo: qual alternativa descreve corretamente variáveis locais e “globais” em Java?

2. Qual será a saída?

class Exemplo {
    static int x = 10;
    public static void main(String[] args) {
        int x = 5;                       // variável local
        System.out.println(x);
        System.out.println(Exemplo.x);
    }
}
      

3. Considere o sombreamento (shadowing) abaixo. Qual a saída?

public class Teste {
    public static void main(String[] args) {
        int total = 0;                // variável local (escopo do método)
        if (true) {
            int total = 5;            // nova variável local (escopo do bloco)
            total++;
            System.out.println(total);
        }
        System.out.println(total);
    }
}
      

4. O que acontece ao compilar o código a seguir?

class A {
    int y = 3;              
    {
        System.out.println(y); 
    }
}
      

5. Qual é a saída?

class Conta {
    private double saldo = 100;          // campo (escopo de classe)
    void depositar(double saldo) {       // parâmetro local sombreia o campo
        saldo += 50;                     // altera apenas o parâmetro local
    }
    public static void main(String[] args) {
        Conta c = new Conta();
        c.depositar(0);
        System.out.println(c.saldo);
    }
}
      

Exercícios de Aplicação AFF Education

Reforce o conteúdo desta aula com mais dois exercícios práticos:

1. Uma variável declarada dentro do método main é considerada:

2. Tentar usar, no main, uma variável declarada apenas dentro de um for (fora dele) resulta em: