有这样一种情况,父类是个抽象类,里面有抽象函数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.   

    根据楼主的描述,调用关系应该是这样的:TT t = new Y();
    t.test2();就是多态形式,楼主有必要好好学习一下面向对象
      

  2.   

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

  3.   

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