子类重写父类的函数后,在子类该函数中调用原父类的函数,出现的有关问题求解释
子类重写父类的函数后,在子类该函数中调用原父类的函数,出现的问题求解释。
看代码
输出:
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!
看代码
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!