La risposta la puoi trovare
qua, in particolare queste righe:
Note: If a constructor does not explicitly invoke a superclass constructor, the Java compiler automatically inserts a call to the no-argument constructor of the superclass.
Questo implica che la tua classe B, di fatto è la seguente:
public class B extends A {
public B() {
super();
}
public void m() {
System.out.println("metodo della classe figlio");
}
}
Questo spiega perché viene chiamato il metodo m(). Poi a causa del dynamic binding viene richiamato il metodo appartenente alla classe B, e non ad A.