quarta-feira, 13 de fevereiro de 2008

[10] Ponto-e-vírgula, escopo e variáveis locais

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;

}


ESCOPO

Um 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:
  1. public static void main(String[] args){
  2. Livro livro = new Livro();
  3. livro.qtdPaginas = 100;
  4. livro.quantidade = 20;
  5. }

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 LOCAIS

Uma variável local não pode ser acessada por toda a classe, apenas dentro do bloco em que foi declarada. Por exemplo:

  1. public class CalculadoraParaSoma(){
  2. int operando1;
  3. int operando2;
  4. public void calcular(){
  5. int resultado = operando1 + operando2;
  6. System.out.println("RESULTADO: ");
  7. System.out.println(resultado);
  8. }
  9. }
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


2 comentários:

Yuri disse...

Parabéns pelo blog! Está muito bem organizado e as explicações estão muito bem feitas!
Seus tutoriais estão sendo de grande ajuda ^^

andrehbl disse...

Obrigado, Yuri! A minha intenção é justamente oferecer conhecimento da forma mais entendível, dentro do possível, a todos que desejem aprender Java.

Um abraço =)