创建子类对象时,父类构造函数中调用被子类重写的方法为什么调用的是子类的方法,而被子类重载的方法不会调用?
2015-07-28 10:26
363 查看
问题:创建子类对象时,父类构造函数中调用被子类重写的方法为什么调用的是子类的方法,而被子类重载的方法不会调用?
问题:为什么创建A对象的时候父类会调用子类方法?但是:创建B对象父类会调用父类的方法?
答案:当子类被加载到内存方法区后,会继续加载父类到内存中。如果,子类
当子类对象创建时,会先行调用父类的构造方法(构造方法也是方法),虚拟机会在子类方法区寻找该方法并运行。但是:由于java语言是静态多分派,动态单分派。其结果是当编译的时候,父类构造方法调用的方法的参数已经强制转换为符合父类方法的参数了。上边代码在编译前已经转换为下面这个样子的了。
看一下上边的代码,是不是恍然大悟?
public class Basic{ public void add(int i) { System.out.println("Basic add"); } public Basic() { add('a'); } } public class A extends Basic{ public void add(int i) { System.out.println("A add"); } } public class B extends Basic{ public void add(char i) { System.out.println("B add"); } } public class Main{ public static void main(String[] args) { A a = new A(); B b = new B(); } }
问题:为什么创建A对象的时候父类会调用子类方法?但是:创建B对象父类会调用父类的方法?
答案:当子类被加载到内存方法区后,会继续加载父类到内存中。如果,子类
重写了父类的方法,子类的方法引用会指向子类的方法,否则子类的方法引用会指向父类的方法引用。如果子类
重载了父类方法,则子类重载方法引用还指向子类方法。如果子类方法没有重写也没有重载父类方法,则方法引用会指向父类方法。
当子类对象创建时,会先行调用父类的构造方法(构造方法也是方法),虚拟机会在子类方法区寻找该方法并运行。但是:由于java语言是静态多分派,动态单分派。其结果是当编译的时候,父类构造方法调用的方法的参数已经强制转换为符合父类方法的参数了。上边代码在编译前已经转换为下面这个样子的了。
public class Basic{ public void add(int i) { System.out.println("Basic add"); } public Basic() { add((int)'a'); } } public class A extends Basic{ public void add(int i) { System.out.println("A add"); } } public class B extends Basic{ public void add(char i) { System.out.println("B add"); } } public class Main{ public static void main(String[] args) { A a = new A(); B b = new B(); } }
看一下上边的代码,是不是恍然大悟?
相关文章推荐
- 用 Windows API “GetAdaptersInfo” 获取 MAC 时遇到的问题
- StartUML自动生成代码
- hdu 杭电1509 Windows Message Queue【优先队列】
- windows-电脑及软件相关一些快捷键
- https://123.56.95.148/svn/Source/secretary
- 采用ovs-docker为容器创建双外部网络
- Spring MVC学习-----------对Action做JUnit单元测试
- iOS工程中删除默认的并使用自建的ViewController后黑屏
- TempData,跳转后的提醒
- Prime Ring Problem
- java基础之 switch
- StartUML自动生成代码 分类: 开发工具 2015-07-28 10:26 11人阅读 评论(0) 收藏
- C#- 实用的Log4Net日志记录例子
- Uninstall Office 2016 for Mac
- poj1286--Necklace of Beads(置换群+polya计数)
- 天声人語 20150728
- Linux进程调度-------O(1)调度和CFS调度器
- Linux下配置本地yum源
- 为什么我们应该为Ruby2.0的GC感到excited!
- hdu3665Seaside 最短路水题