有这样一种情况,父类是个抽象类,里面有抽象函数Test(),还有个私有函数Test1()和一个protected 函数Test2(),现在子类继承父类,重写了抽象函数Test(),而父类的Test2()函数调用Test1()函数,Test1()函数调用了Test()函数,现在实例化子类对象,调用Test2()函数,能输出重写的抽象函数内容。代码如下:abstract class TT{
int j=5;
public abstract void Test();
private void Test1(){
Test();
}
public void Test2(){
Test1();
}
}
class Y extends TT{ @Override
public void Test() {
System.out.println("j="+j);
}
}我有个地方搞不太懂,子类重写了父类抽象函数,而父类的私有函数为什么能成功调用子类重写的抽象函数?这点不太明白,希望懂的朋友帮忙讲一下。
int j=5;
public abstract void Test();
private void Test1(){
Test();
}
public void Test2(){
Test1();
}
}
class Y extends TT{ @Override
public void Test() {
System.out.println("j="+j);
}
}我有个地方搞不太懂,子类重写了父类抽象函数,而父类的私有函数为什么能成功调用子类重写的抽象函数?这点不太明白,希望懂的朋友帮忙讲一下。
第一,在编译期,test()函数的签名已经存在,所以,不管这个函数有没有提供实现,在编译期中都可以调用它
这个应该很好理解吧,我只是告诉你要干什么,至于你怎么干那是你的事情,和我无关第二,在执行期,你实际执行的对象是子类对象,而不是父类对象,而多态的原则是子类会继承所有父类的方法,所以,虽然你的子类中没有去重写test1()这个函数,但是实际上,你真正运行的函数还是子类.test1(),这个函数中调用的是子类.test(),所以,这并不会成为问题
关键在于"实际对象"是谁,你的实际引用对象是子类Y
而多态的调用是自下而上的
所以,调用顺序是这样:
Y.test2() -> test1() // 采用TT的实现test2(),可以访问TT.test1()
TT.test1() -> test() // 子类Y中已经重写了test()实现,所以访问了Y.test()
在父类中非private函数调用了private函数;所以子类继承父类后,可以使用父类的非private函数,而间接调用了父类的private函数。
2、由于多态,子类重写了父类的函数,所以父类的private函数会调用这个重写后的子类的函数。