类的多态
多态:一种类型声明的的变量,可以引用多种实际类型对象
多态的实现存在三个前提(不满足则不构成类的多态)
- 继承:子类继承父类属性、方法
- 方法重写:子类重写父类方法
- 向上转型:子类实例对象赋值给父类引用变量
- 子类实例对象:
new Son();
- 父类引用变量:
Father father;
简单的说,子类重写了父类的实例方法,且子类对象赋值给了父类变量,这就是类的多态、多种形态
类的多态中,分为两个重要的点(务必注意,多态理解的核心)
- 多态的向上、向下转型
- 多态的静态、动态绑定
多态的向上转型
多态的向上转型:当子类实例变量赋值给父类引用变量
Father father = new Son();
多态的向上转型:(构成多态)
- 父类引用变量可以调用子类重写的父类方法
- 父类引用变量不可以调用子类中独有的方法
多态的向下转型
多态的向下转型:将向上转型的父类引用变量再强转会子类引用变量
Son son = (Son) father;
多态的向下转型,实质就是转换为原来的类型,向下转型之后不构成
类的多态
多态的向下转型:(不构成多态)
- 必须以多态的向上转型为前提条件(先向下,再向上)
- 在向下转型的过程中必须是 强制类型转换
- 为了避免类型转换异常,可以通过关键字
instanceof
判断 - 多态向下转型后,子类引用变量可以 调用子类特有的方法
instanceof
关键字用于比较两个类是否存在继承关系
多态的静态绑定
静态绑定:在程序编译时确定的方法(子类无法重写的父类静态方法)
编译时类型 变量 = new 运行时类型();
简单的理解,根据子类是否存在,父类的同名静态方法
- 若子类存在同名静态方法,调用子类实现(就近原则,以 new 的实例对象为准)
- 若子类不存在同名静态方法,调用父类实现
多态的动态绑定
动态绑定:在程序运行时确定的属性、方法,以右侧运行时类型为准
静态绑定针对的是 static 类属性,而动态则是实例属性、实例方法
当多态向上转型的父类引用变量,调用父类、子类中同名的属性、方法时,实际调用的是子类重写的父类方法(实例属性、实例方法)
简单的理解,一个类重写了 toString()
,再通过该类对象调用,则不再是 Object
子类重写了父类的实例方法,且在右侧实例对象是子类时,则调用子类的实现
标签:变量,子类,多态,转型,实例,父类 来源: https://www.cnblogs.com/wyfyjc/p/14881927.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。