创建子类对象时,父类构造函数中调用被子类重写的方法为什么调用的是子类的方法,而被子类重载的方法不会调用?
来源:互联网 发布:淘宝站内推广方法有哪些 编辑:程序博客网 时间:2024/04/28 00:49
出处:http://blog.csdn.net/liu251890347/article/details/47101567
看一下上边的代码,是不是恍然大悟?
问题:创建子类对象时,父类构造函数中调用被子类重写的方法为什么调用的是子类的方法,而被子类重载的方法不会调用?
- 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();
- }
- }
看一下上边的代码,是不是恍然大悟?
阅读全文
0 0
- 创建子类对象时,父类构造函数中调用被子类重写的方法为什么调用的是子类的方法,而被子类重载的方法不会调用?
- 创建子类对象时,父类构造函数中调用被子类重写的方法为什么调用的是子类的方法,而被子类重载的方法不会调用?
- 父类构造器调用被子类重写的方法
- 调用被子类重写的方法
- 创建子类对象会调用父类的初始化方法,而不只是构造函数
- 不要在构造函数中调用以后会被子类重写的方法
- 父类构造函数调用被子类重写的方法——要避免!
- java父类调用被子类重写的方法
- Java中不要在父类的构造方法中调用会被子类重写的方法
- Java之调用被子类重载的方法
- 父类引用指向子类对象,为什么会调用的是子类中重新的方法
- Java 父类构造函数中调用子类重写的方法
- Java__子类中调用父类重写的方法。
- java 父构造器中调用子类重写的方法
- java中实例化子类时会不会调用父类的构造方法?
- 《C++面向对象》在C++中子类继承和调用父类的构造函数方法
- java中子类调用父类的构造方法
- 为什么子类的构造方法一定会调用父类的某个构造方法
- Java List接口
- 扩展spring schema 的方法, 代码下载
- git
- ActiveMQ(三)--ActiveMQ服务启动
- 远程连接 linux 进行操作
- 创建子类对象时,父类构造函数中调用被子类重写的方法为什么调用的是子类的方法,而被子类重载的方法不会调用?
- numpy教程:统计函数Statistics
- 线程池详解之总纲篇
- 时实时钟RTC驱动移植(PCF5863)
- 日常学习2017.7.14
- 学习canvas
- day_15_socket模型、TCP模型
- 成员变量和局部变量 (静态变量)类变量和实例变量
- 【STL】set用法