子类重写父类的函数后,在子类该函数中调用原父类的函数,出现的有关问题求解释

子类重写父类的函数后,在子类该函数中调用原父类的函数,出现的问题求解释。
看代码
class A {
void f(int a) {
if(a == 0) return ; 
System.out.println(".....:   " + a); 
f(a - 1); 
}
}
class B extends A{
void f(int a) {//如果不重写,写一个新的函数的话,和我 预料的一样
System.out.println("WTF"); 
super.f(a); 
}
}

public class Main{
public static void main(String args[]) {
B t = new B(); 
t.f(5); 
}
}

输出:
WTF
.....:   5
WTF
.....:   4
WTF
.....:   3
WTF
.....:   2
WTF
.....:   1
WTF
我认为应该输出:
WTF
.....:   5
.....:   4
.....:   3
.....:   2
.....:   1

在子类中如果不重写f,写一个新的方法的话,和我预料的一样,是下面的输出。
我不明白为什么会出现第一种的那种输出,为什么会多输出“WTF”

求解释。。。
------解决思路----------------------
用super.f(a)调用时,相当于是父类变量引用子类对象,所以,在调完Class A的f()方法后,递归调用时,实质上是调用了子类中重写的父类方法。
------解决思路----------------------
t 的运行时类型为B
这个是关键
t调用自己的f(),主体里调用父类的f()
父类主体里再调用f(),但是这个调用者却不是父类
而是其子类对象t
写全点是this.f(),this和t是同一个引用
不管这个this.f()在上面位置,子类也好父类也呗
根据多态性都会调用子类的f()
如此来回递归
这样理解对吧?

------解决思路----------------------
   刚好今天看到这个知识点:
  java中方法的调用分为两种   1  static修饰的方法是类作为主调去调用
                                                      2 非static修饰的方法是实例作为主调去调用,也就是this关键字去调用

你这段代码中,递归方法:f(a-1),其实在JVM编译的时候编译为:this.f(a-1)。 而这个this指的就是你创建的对象的引用,也就是子类的实例对象,所以调用的方法也是子类的。所以每次都出现了WTF!