大家好,我是神韵,是一个技术&生活博主。据说是21天成一习惯,那么有没有一个习惯可以让你坚持一年的?我来试试!
每周5讲从2021-7-19开始,今天是2021-9-9,一轮计划是2022-7-18结束。关于文章都是定位为基础,我不敢讲的太深入,因为我怕自己没时间。欢迎来点赞打卡,你们的行动将是我无限的动力。
今日主题是:多态中类的真实调用(父类引用、子类实例)
话不多说,下面进入今日主题
今天围绕下面一句话展开
编译看父类,运行看子类
如何理解这句话呢?
首先所有的前提都在于:不论成员变量还是成员方法都是建立在被使用的时候(也就是规范使用吧),下面我所讲的内容才有效(如第一张图片中,son如果不被使用,根本不会产生编译不过去的问题)。
1、编译时看父类
对于成员变量,编译时看父类的变量,如果父类有此变量则编译成功,如果没有则编译失败,如下代码展示。
对于成员方法,编译时看父类的方法,如果父类有此方法则编译成功,如果父类没有此方法则编译失败,如下代码展示。
2、运行时看子类
运行时看子类,这是指成员方法…
运行时成员变量以父类的变量为主,即运行结果就是父类的变量。也就是子类的变量存不存在都不影响。
运行时成员方法以子类的方法为主,但是如果子类方法不存在,则运行的是父类的成员方法。即子类有则执行子类,子类没有则执行父类的成员方法。
注释子类Sub中的getParent(),则运行结果是1,1。
总结
无论是成员变量还是成员方法编译时都要看父类;运行时成员变量看父类,成员方法看子类;
ps:多态的前提是继承,必须拥有子父类关系或者接口类和实现类关系,否则无法完成多态。
学会了吗,那下面的例子输出啥呢?
答案是0,没错,调用的确实是S的方法。为啥是0呢,答案又在上一篇文章–(父子类中静态、非静态、构造代码及方法执行顺序)。
提示:父静态代码>子静态代码>父普通代码>大于父构造方法>子普通代码(关键在这)>子构造方法。
OR07-父子类中静态、非静态、构造代码及方法执行顺序
本文结束!
ps:私信我可以进群。公众号每天会有推送,欢迎关注公众号查阅。