Polymorphie, Vererbung und statische Methoden in Java

In einer Klasse können Methoden überschrieben werden (Polymorphie). Aber was ist mit statischen Methoden? Man kann auch in einer abgeleiteten Klasse eine Methode mit gleicher Signatur wie in der Basisklasse definieren. Ist das immer noch "überschreiben"? Worin besteht der Unterschied?

Das Überschreiben bzw. Polymorphie passieren zur Laufzeit, das Laden der statischen Methoden geschieht jedoch bereits beim Kompilieren. Deswegen können statische Methoden nicht überschrieben werden und man spricht hier von "Ausblenden" bzw. von "Shadowing". Dazu ein kleines Beispiel:

public class A {
    public static int test() {
        return 1;
    }
 }

public class B extends A {
    public static int test() {
        return 2;
    }
}

Wir haben hier zwei einfache Klassen definiert, die Methode "test" wird in der Klasse B "shadowed" (dass hier statische Methoden an Instanzen aufgerufen werden dient nur zur Demonstration):

A a = new A();
B b = new B();
System.out.println(a.test()); // 1
System.out.println(b.test()); // 2

Hier ist das Ergebnis wie erwartet 1 und 2. Was passiert jedoch, wenn wir für "a" die Referenz auf "b" setzen?

a = b;
System.out.println(a.test()); // 1

Interessanterweise ist das Ergebnis die 1: Die statische Methoden binden an den Typen und nicht die Objekt Instanz. Und beim Kompilieren war es eben "A" und nicht "B".