O problema no seu código é:
1º problema:
Quando se estende uma classe de outra classe e tem um método de mesmo nome e retorno o método ele no caso o void a() ele é sobreposto.
Então quando você faz isso e chama o a() antes de atribuir o valor de n, logo seria +/- isso
public static void main(String[] args) {
new B();
}
//new B(); vai chmar os métodos
System.out.println(n.length()); // método void a(){} sobreposto
n = "aprendendo"; //seguido da atribuição.
logo não irá funcionar o código já que n não tem valor.
Você pode modificar o nome do método void a da classe A ou classe B, assim fará com que o método possa ser executado corretamente.
Uma alternativa é colocar a chamada a() logo abaixo do n = "aprendendo" ficando:
class A {
final String n;
A() {
n = "aprendendo";
a();
}
void a() {
System.out.println("testa");
}
}
class B extends A {
void a() {
System.out.println(n.length());
}
public static void main(String[] args) {
new B();
}
}
resultado:
10
Ai sim você verá o método ser sobreposto.
Ou então mudar o nome do método no caso de B ficando:
class A {
final String n;
A() {
a();
n = "aprendendo";
}
void a() {
System.out.println("testa");
}
}
class B extends A {
void c(){
System.out.println(n.length());
}
public static void main(String[] args) {
new B().c();
}
}
Resultado
testa
10