有这样一种情况,父类是个抽象类,里面有抽象函数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);
}
}我有个地方搞不太懂,子类重写了父类抽象函数,而父类的私有函数为什么能成功调用子类重写的抽象函数?这点不太明白,希望懂的朋友帮忙讲一下。
解决方案 »
- indexOf和matches对字符串的读取不一样?
- 如何用jdom解析xml
- 为什么这个tabbedpane 不显示出来呀?
- 为什么,为什么,一个小小的问题困扰了我一天,麻烦前辈帮帮我,我不想说跪求,因为我是男人,所以不会轻易下跪
- 怎样显示上传过的图片文件struts
- 关于applet的运行
- 如何获得客户端IP地址?在线等
- 初学者问:有没有辅助的工具可以对Api文档进行搜索查询,比如我知道某一方法,输入后能列出包含此方法的所有类。再比如就是知道一个类,想
- 请问在那里可以下载到jbuilder的帮助文档,要‘安装
- 如何获取桌面路径
- 一道java面试题考考你的基础,扎实吗?
- 安装VirtualBox后如何通过java获取本机IP
第一,在编译期,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函数会调用这个重写后的子类的函数。