Originariamente inviato da djdan8787
Ma in ogni caso è sempre così?
Sì.
Il compilatore si basa solo sul tipo del reference (e non sul tipo dell'oggetto realmente istanziato) per stabilire quale variabile di istanza (o di classe) o quale metodo (tra quelli eventualmente in overload) usare.
È poi a runtime che può entrare in gioco la questione del override.

codice:
class A {
    public void stampa () {
        System.out.println ("stampa in A");
    }
}

class B extends A {
    public void stampa () {
        System.out.println ("stampa in B");
    }
}
Sia che tu faccia:
A x = new B();
x.stampa ();

oppure:
B x = new B();
x.stampa ();

viene stampato in entrambi i casi "stampa in B". Questo perché entra in gioco l'override in B del metodo stampa().