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

    亲...能不能不要用test1 2 3 4,或者abcd这种命名...看的眼花...这个要分两个方面来看
    第一,在编译期,test()函数的签名已经存在,所以,不管这个函数有没有提供实现,在编译期中都可以调用它
    这个应该很好理解吧,我只是告诉你要干什么,至于你怎么干那是你的事情,和我无关第二,在执行期,你实际执行的对象是子类对象,而不是父类对象,而多态的原则是子类会继承所有父类的方法,所以,虽然你的子类中没有去重写test1()这个函数,但是实际上,你真正运行的函数还是子类.test1(),这个函数中调用的是子类.test(),所以,这并不会成为问题
      

  2.   

    还有一点,即时调用的函数是一个private函数,那也没关系
    关键在于"实际对象"是谁,你的实际引用对象是子类Y
    而多态的调用是自下而上的
    所以,调用顺序是这样:
    Y.test2() -> test1() // 采用TT的实现test2(),可以访问TT.test1()
    TT.test1() -> test() // 子类Y中已经重写了test()实现,所以访问了Y.test()
      

  3.   

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