Fala, Pedro!
De fato é possível acessar super.metodo() quando este método é estático na classe mãe. Mas isso é possível porque o compilador infere que você está querendo fazer A.method(), no seu exemplo.
O código compilado da chamada super.method() é 0 invokestatic A.method() : void [30]
Percebe que ele substituiu o super por A.
Isso porque o compilador vai escolher o método chamado pelo tipo da variável onde ele é chamado. Um exemplo interessante é esse:
class Animal {
static void fazBarulho() {
System.out.println("Grrr");
}
}
class Cachorro extends Animal {
static void fazBarulho() {
System.out.println("Au au");
}
}
class TestaCachorro {
public static void main(String[] args) {
Cachorro c = new Cachorro();
c.fazBarulho(); // Au au
Animal a = new Cachorro();
a.fazBarulho(); // Grrr
}
}
O objeto cachorro que está referenciado como “Animal” deixou de latir. Percebe que não houve a sobrescrita do método fazBarulho(). Como o tipo da referência onde foi chamado o método fazBarulho() é “Animal” o comportamento vai ser o definido na classe “Animal”, embora o objeto “Cachorro” devesse ter o comportamento específico de fazer “Au au”.
Só pra ilustrar, o código compilado vai ser:
invokestatic Cachorro.fazBarulho()
e depois
invokestatic Animal.fazBarulho()
Espero ter ilustrado um pouco o porque de não considerarmos sobrescrita do método.
Valeu!
PS - Só agora percebi que refiz o 1o exemplo da thread
. Mals.