Java 多态学习总结
本章目标
- 掌握多态的概念(难点)
多态的概念
在面向对象编程中,多态是指同一个行为具有多个不同的表现形式或形态的能力(相同的行为,不同的实现)
为何使用多态
多态的好处是不管类的实现代码怎么改动都不会影响到类的使用代码,这样的代码会有更好的可扩展性;这就是设计原则当中所谓的"只针对抽象编程,而不是针对实现编程"
多态的分类
静态多态(编译时多态,早绑定)
编译时系统就能决定对象调用对应的方法 (使用方法重载实现)
动态多态(运行时多态,晚绑定)
运行时系统才能动态确定对象调用的方法 (使用动态绑定技术和方法重写实现)
向上转型和向下转型
- 向上转型(自动类型转换):从子类向父类转换类型
Father father = new Son();
- 向下转型(强制类型转换):从父类向子类转换类型
Father father = new Son(); Son son = (Son)father;
instanceof 关键字
Java 语言的动态多态机制导致了引用类型变量的声明类型和实际引用对象的类型可能不一致。为更准确鉴别一个对象的真正类型,Java语言引入了 instanceof 运行符,用于判断运行时对象的真正类型
语法格式(判断运行时对象是否是特定类或其子类的一个实例,返回布尔值)
对象名 instanceof 类名
Son son = new Son ( );
if ( son instanceof Son ) { //判断运行时对象的真正类型
System.out.println(“son对象的类型是 Son”) ;
}
动态绑定的技术
动态绑定(dynamic binding)也叫延迟绑定或后期绑定,指在运行时判断所引用对象的实际类型,根据实际类型调用其相应的方法,它是实现动态多态的最关键技术
动态绑定条件
- 子类与父类有继承关系
- 子类重写父类的方法
- 父类变量引用子类对象(向上转换)
- 父类变量调用子类重写的方法
public class Father {
public void play() { return “打篮球”;}
}
public class Son extends Father {
public void play() { return “踢足球”;}
}
Father father = new Son( );
father.play( );
多态的优点
-
可替换性
多态对已存在的代码具有可替换性
-
可扩展性
增加新的子类不影响已存在类的多态性、继承性,以及其他特性的运行和操作。实际上新加子类更容易获得多态功能
-
接口性
多态是超类通过方法签名,向子类提供了一个共同接口,由子类来完善或者覆盖它而实现的
- 灵活性
- 简化性