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

ACM_Napoleon 2015-03-17 08:09:37
看代码
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”

求解释。。。
...全文
247 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
hongbucai 2015-03-17
  • 打赏
  • 举报
回复
以及你后面为什么不重写f方法,就会出现想要的结果。因为子类继承了父类的方法,子类的实例对象中就有2个方法:一个是父类继承来的f方法,一个是子类特有的方法。
hongbucai 2015-03-17
  • 打赏
  • 举报
回复
刚好今天看到这个知识点: java中方法的调用分为两种 1 static修饰的方法是类作为主调去调用 2 非static修饰的方法是实例作为主调去调用,也就是this关键字去调用 你这段代码中,递归方法:f(a-1),其实在JVM编译的时候编译为:this.f(a-1)。 而这个this指的就是你创建的对象的引用,也就是子类的实例对象,所以调用的方法也是子类的。所以每次都出现了WTF!
ACM_Napoleon 2015-03-17
  • 打赏
  • 举报
回复
引用 3 楼 qq118194716 的回复:
t 的运行时类型为B 这个是关键 t调用自己的f(),主体里调用父类的f() 父类主体里再调用f(),但是这个调用者却不是父类 而是其子类对象t 写全点是this.f(),this和t是同一个引用 不管这个this.f()在上面位置,子类也好父类也呗 根据多态性都会调用子类的f() 如此来回递归 这样理解对吧?
我明白你说的调用过程了,不过为什么 ---------------------------- 父类主体里再调用f(),但是这个调用者却不是父类 而是其子类对象t ------------------------------- 因为多态性?
飏飏一蝶 2015-03-17
  • 打赏
  • 举报
回复
t 的运行时类型为B 这个是关键 t调用自己的f(),主体里调用父类的f() 父类主体里再调用f(),但是这个调用者却不是父类 而是其子类对象t 写全点是this.f(),this和t是同一个引用 不管这个this.f()在上面位置,子类也好父类也呗 根据多态性都会调用子类的f() 如此来回递归 这样理解对吧?
三仙半 2015-03-17
  • 打赏
  • 举报
回复
用super.f(a)调用时,相当于是父类变量引用子类对象,所以,在调完Class A的f()方法后,递归调用时,实质上是调用了子类中重写的父类方法。
ACM_Napoleon 2015-03-17
  • 打赏
  • 举报
回复
主要是父类中方法是递归的,上面这个问题是我之前写一个递归时,出现的。。。可以简化成上面的代码。。。

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧