2
respostas

Por que esse código não compila?

Olá pessoal. A questão não explicou porque esse código não compila. Eu acredito que seja porque a declaração da variável static x está sobreescrevendo a declaração da superclasse.

class B {
    int x = 1;
}
class A extends B {
    static int x = 2;
    public static void main(String[] args) {
        System.out.println(super.x);
    }
}

Alguém sabe explicar porque isso ocorre?

2 respostas

Quando você executa, você recebe a seguinte mensagem:

 non-static variable super cannot be referenced from a static context

Ou seja, pelas regras do Java, você não pode usar uma variável não static dentro de um método static.

Isso também acontece com métodos, ex:

class B {
    public void testeNaoStatic(){
        System.out.println("Teste ok?");
    }
}
class A extends B {
    static int x = 2;
    public static void main(String[] args) {
        testeNaoStatic();
    }
}

Resultado:

non-static method testeNaoStatic() cannot be referenced from a static context

Nesse caso, ele nem está reclamando da varável x ainda (mas irá), problema atual é com o super (clique aqui para mais detalhes).

Só complementando o que o Paulo já disse, um método estático só se relaciona com variáveis estáticas dentro da mesma classe e/ou herança. Ou seja, por estar dentro de um método estático não vai rolar.