Probleminhas em Java…escopo e afins…

Olá,

Verificando algumas em concursos levantei alguns detalhes que aparentemente estão causando muitas dúvidas em quem resolve problemas em java quanto a escopo de variáveis, o assunto é muito extenso, mas separei algumas questões com dicas.

Uma questão com uma pegadinha incrível, vejam o seguinte
considerando o código…

public static void main(String[] args) {

int i = 2;
if (i == 2) {
int x = 2;
}

System.out.println(Integer.toString(x));

}

Lembrar que não é válido copiar e colar no Eclipse ou Netbeans.

o que ocorre no código acima? Ele roda, compila?
Pense….
Resposta…na verdade a questão é bem simples, o código
não compila, pois vai acusar erro na variável x no comando println. Porquê?

Simplesmente porquê a variável foi definida um pouco acima entre um par de chaves {}, e portanto só existe para aquela parte do código, é seu escopo.

Um caso curioso encontra-se abaixo, verifique se funciona ou não o código:

public class Private {


private int escondaMe = 5;

public static void main (String[] args) {

Private test = new Private();

System.out.println(test.escondaMe);

}

}

Note que o código é válido, isto pois a variável escondaMe, por mais que seja privada encontra-se no mesmo trecho de código do método main, mesmo escopo.
Verifique também que a variável escondaMe é estática, pertence portanto a classe Private.
Agora…

public class Private {


public Private() {


int escondaMe = 5;


}

public static void main(String[] args) {

Private test = new Private();

System.out.println(test.escondaMe);
}


}

Este programa não funciona, pois a variável escondaMe pertence (privada) a uma instância da classe Private, não é estática e está definida para uso dentro do construtor, impossibilitando portanto seu acesso no método main.

Por fim, este último probleminha

Considere a classe abstrata abaixo:

public abstract class Parent{


public Parent(){

set();

}

public abstract void set();

}

agora verifique a segunda classe

public class Child extends Parent {

public int a;

public int b = 0;

public Child() {

super();

}

public static void main(String[] args) {

Child c = new Child();

System.out.println(“a is ” + c.a);

System.out.println(“b is ” + c.b);

}

@Override

public void set() {

a = 15;

b = 15;

}

}

Ao executar este código o resultado é:

a is 15
b is 0

Porquê?

Tente… nas próximas semanas deixo o resultado em comentário aqui.

Bons estudos e espero ter sido de ajuda, ou ao menos então divertido com as questões

Até!

»crosslinked«

Mauricio Antonio Ferste

Graduação em Bacharelado em Informática pela Universidade Federal do Paraná (1997) e mestrado em Engenharia Elétrica e Informática Industrial pela Universidade Tecnológica Federal do Paraná (2006). Tem experiência na área de Ciência da Computação, com ênfase em Sistemas de Informação. Atualmente funcionário do SERPRO (www.serpro.gov.br), atua no desenvolvimento de sistemas. Professor atuante na FAMEC (http://www.famec.com.br), no curso de Bacharelado em Sistemas de Informação (Curriculum Lattes: http://lattes.cnpq.br/9368615800123473).

Você pode gostar...

3 Resultados

  1. Salazar disse:

    Você deu uma derrapada nessa frase, Verifique também que a variável escondaMe é estática, pertence portanto a classe Private.”. A variável escondaMe não é estática.

    Muito legal o exercício, erraria fácil na prova.

  2. Leonardo Marcelino disse:

    Maurício, não vai postar a resposta?

  3. Marcelo disse:

    E então ? Qual o veredito ?

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *