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:
- 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 LOCAIS
Uma 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);
- }
- }
"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:
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 ^^
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 =)
Postar um comentário