[10] Ponto-e-vírgula, escopo e variáveis locais
Autor: Leitão Maluco | Publicado: 2008-02-13T07:27:00-08:00

Neste Post vamos aperfeiçoar um pouco os nossos conhecimentos sobre o que vimos até o momento. Entenderemos o motivo do uso do símbolo ";" após a invocação de comandos, entenderemos também do que se trata um escopo e variáveis locais.PONTO-E-VÍRGULA (;)  Cada comando deve ser finalizado com ponto-e-vírgula (;).  Em Posts anteriores já trabalhamos com mais de um comando, por exemplo:System.out.println(" Primeiro comando ");System.out.println(" Segundo comando ");O mesmo acontece com a criação de objetos e chamadas a métodos - se você ainda não sabe, "println()" é  um método. Supondo que exista uma classe chamada Porta, onde seus métodos são abrir() e fechar(), veremos o uso de ponto-e-vírgula no final das chamadas:Porta p = new Porta();System.out.println("O método abrir() será chamado");p.abrir();System.out.println("O método fechar() será chamado");p.fechar();E para que não reste mais dúvidas sobre o uso de ponto-e-vírgula, este símbolo também é usado na declaração de atributos:public class Porta{boolean estaAberta;String tipoPorta;}ESCOPOUm escopo delimita o "tempo de vida" de uma variável, seja ela de referência ou de um tipo primitivo. Esta delimitação é definida através dos símbolos "{" e "}", que são equivalentes às instruções "Begin" e "End", respectivamente, em linguagens como Pascal. O espaço delimitado pelos símbolos "{" e "}" é denominado bloco.Observe a classe Livro abaixo:public class Livro {     String titulo;      String autor;      int qtdPaginas;  }Isso significa dizer que os atributos titulo, autor e qtdPaginas de um objeto do tipo Livro existirão enquanto o objeto existir, pois seu escopo está definido para toda a classe.  Observe o escopo do método escreverQuantidadePaginas() da classe abaixo:public class Livro {   String titulo;   String autor;   int qtdPaginas; public void escreverQuantidadePaginas(){       int quantidade = qtdPaginas;       System.out.println("QUANTIDADE DE PAGINAS: ");       System.out.println(quantidade);} } O escopo da variável "quantidade", está limitado ao método escreverQuantidadePaginas(). Isso implica dizer que quando o método escreverQuantidadePaginas() for encerrado a variável "quantidade" já não mais poderá ser referenciada.Um ponto importante a se ressaltar é que "quantidade" estará acessível apenas dentro do método escreverQuantidadePaginas(). Porém, note que a variável "qtdPaginas" está sendo acessada de dentro do método escreverQuantidadePaginas(), isso é possível porque o escopo de "qtdPaginas" foi definido para toda a classe, e o método escreverQuantidadePaginas() pertence à classe. Desde já o atributo "qtdPaginas" pôde ser acessado através do método.  Para melhor compreensão vamos instanciar um objeto do tipo Livro:   public static void main(String[] args){     Livro livro = new Livro(); } Você pode livremente acessar os atributos do objeto livro como atribuir valores e exibí-los.  public static void main(String[] args){      Livro livro = new Livro();    livro.autor = "André Leitão";      livro.qtdPaginas = 100;       System.out.println("QUANTIDADE PÁGINAS: ");      System.out.println(livro.qtdPaginas);} Mas você não pode acessar a variável "quantidade", pois seu tempo de vida está delimitado pelo escopo do método escreverQuantidadePaginas(). Desde já seria um erro codificar:  public static void main(String[] args){   Livro livro = new Livro();   livro.qtdPaginas = 100;   livro.quantidade = 20;}A funcionalidade da linha 4  insinua algo como:  "atribua o valor 10 à variável quantidade, que pertence ao objeto livro". E esta atribuição não será possível porque "quantidade" não será reconhecida como um atributo do objeto livro.Observe a figura abaixo:ATRIBUTOS SÃO VARIÁVEIS?Atributos são variáveis, pois armazenam valores e estes valores podem ser alterados e/ou obtidos.  A diferença básica entre um atributo e uma variável local é que o escopo de um atributo é delimitado pelo bloco de sua classe, e o escopo de uma variável local é delimitado por um outro bloco qualquer.VARIÁVEIS LOCAISUma variável local não pode ser acessada por toda a classe, apenas dentro do bloco  em que foi declarada. Por exemplo:public class CalculadoraParaSoma(){     int operando1;   int operando2;   public void calcular(){      int resultado = operando1 + operando2;      System.out.println("RESULTADO: ");      System.out.println(resultado);   }  }Note que na linha 66 uma variável local foi declarada. A variável local resultado receberá a soma dos atributos "operando1" e "operando2". Logo em seguida o resultado da soma é exibido."resultado" não estará acessível para toda a classe. Apenas para o método em que ela foi declarada. Portanto seria um erro codificar:public static void main(String[] args){   CalculadoraParaSoma calc = new CalculadoraParaSoma();   calc.operando1 = 2;   calc.operando2 = 6;   calc.resultado = operando1 + operando2;}Ao tentar compilar este código, o compilador exibirá a seguinte mensagem de erro:"calc.resultado cannot be resolved or is not a field"Isto é, "resultado" não é reconhecido como membro do objeto calc. "resultado" é acessível apenas dentro do bloco onde foi declarado. No caso, o método calcular().Várias variáveis locais de diferentes tipos podem ser declaradas dentro um método, e não obrigatoriamente elas precisam ser inicializadas. Observe um bloco qualquer abaixo:{   int valor1;   int valor2 = 50;   String nome = "Java";   double altura;   altura = 3.4;   valor1 = 8;}Este bloco funcionará sem problemas. No total ele tem 4 variáveis locais, o que implica dizer que elas poderão ser acessadas até que o bloco se finalize.Tente usar o conteúdo deste bloco em algum método como o main, por exemplo - não se esqueça de que main também é um método - e imprima os valores das variáveis locais.Este Post fica por aqui. Um abraço