日期:2014-05-20  浏览次数:20794 次

求助:关于继承与调用的问题!
有这样一种情况,父类是个抽象类,里面有抽象函数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);

}
}

我有个地方搞不太懂,子类重写了父类抽象函数,而父类的私有函数为什么能成功调用子类重写的抽象函数?这点不太明白,希望懂的朋友帮忙讲一下。

------解决方案--------------------
1、首先,父类的private函数,子类不能直接调用的。
在父类中非private函数调用了private函数;所以子类继承父类后,可以使用父类的非private函数,而间接调用了父类的private函数。
2、由于多态,子类重写了父类的函数,所以父类的private函数会调用这个重写后的子类的函数。 

------解决方案--------------------
子类对象.Test2()就是调用父类继承而来的Test2()方法(因为子类没有重写Test2)
父类的Test2方法会调用父类的Test1方法,父类的Test1方法会调用Test方法,这里因为Test方法被子类重写了,所以实际调用的Test方法就是子类的Test方法