questão de certificação 4

class Teste{
    
    private static int a;
    
    public static void main(String [] args){
       a = 0;
       metodoA(a);
       System.out.println(a);
   }
   
   public static void metodoA(int a){
     a++;
   }
}

Qual o resultado?
a - imprime 0
b - imprime 1
c - dá erro na compilação
d - dá uma exception na execução
e - nenhuma das anteriores

  1. :smiley:

Porque a certa é a letra a?

Porque em Java, a passagem de parâmetros é por valor, e o método metodoA(int a) altera a cópia local da variável. :wink:

[]'s

sim, mas qual variavel a q é incrementada??
Entendi que a variavel a da classe foi incrementada e recebeu o valor 1.

Mas a variavel a do metodo main é local, por isso exibiu zero.

É isso mesmo??

Ao contrário…

A variável “a” dentro do método metodoA() é incrementada, mas assim que este método termina ela é “eliminada”.
E a variável “a” static da classe (e não local do método main()!) continua com o mesmo valor que começou, por isso imprime 0.

O que acontece dentro do método metodoA() é chamado de shadowing ou sombreamento(tradução horrível! acho que fica melhor ocultar), ou seja, a variável local tem o mesmo nome de uma de instância ou classe, mas a local é a que é enxergada pelo método.

Para alterar a variável static bastaria mudar:

  • colocando o nome da classe: Teste.a++
  • trocar o nome do argumento (variável local) por um diferente de a
  • se tivesse uma instância da classe(dentro de metodoA):
    Teste t = new Teste();
    t.a++;

Certo? :wink:

Ahhh… entendi, dentro do método metodoA(), a variavel incrementada é do parametro e nao a da classe, logo ela é eliminada …

A variavel a do metodo main e do metodoA nao tem nada a ver com a variavel static a da classe Teste, so o nome q é o mesmo …

Estou certo?

[quote=“elvishr”]Ahhh… entendi, dentro do método metodoA(), a variavel incrementada é do parametro e nao a da classe, logo ela é eliminada …
[/quote]
Correto.

[quote=“elvishr”]
A variavel a do metodo main e do metodoA nao tem nada a ver com a variavel static a da classe Teste, so o nome q é o mesmo …

Estou certo?[/quote]
Errado.

Só tem 2 variáveis com nome a.
A variável dentro do método main() É a variável static da classe!
E não tem nada a ver com a do metodoA().

[quote=“ana_abrantes”]

  • colocando o nome da classe: Teste.a++[/quote]

Acho que mais facinho seria this.a++;

Em método estático não se pode usar this!

Muito obrigado, vou tentar não esquecer disso :wink: