多态概念
- 多态性是指同一操作作用于某一对象,可以有不同的解释,产生不同的执行结果。
- 多态的体现方式
- 在运行时父类或者接口引用变量引用其子类对象。
- 多态的前提
- 需要存在继承和实现关系
- 同样的方法调用而执行不同操作、运行不同代码。(重写操作)
- 多态的作用
- 多态通过分离做什么和怎么做,从另一个角度将接口和实现进行分离
- ”多态“消除了类型之间的耦合关系
- 多态的存在提高了程序的扩展性和后期的可维护性。
对象上下转型
- 由子类转型成父类,在继承图上是向上移动的,一般称为向上转型
- 向上转型是从一个叫专用类型向较通用类型的转换,所以总是安全的,也就是说,子类是父类的一个超类
- 向上转型中,类接口中唯一可能发生的事情是丢失方法,而不是获取方法,与之相反操作是向下转型,不安全(可能需要instanceof操作符的协助)
- LSP(liskov替换原则):子类型必须能够替换掉他们的基本类型
- 安全的上转型和LSP的实施,充分体现继承的”is - a“关系
- instanceof运算符用来在运行时通过返回一个布尔值来指出对象是否是特定类或者是它的子类的一个实例
用法:
result = object instanceof class result : 布尔类型 object : 必选项,任意对象表达式 class:必选项,任意已定义的对象类 说明:如果object 是 从class或其子类的一个实例,则instanceof运算符返回true, 如果不是,或者object是null,则返回false
- 典型使用场合
- 在对对象做上下转型之前,没有其它有关对象类型信息时务必使用instanceof来判断一下,以免抛出ClassCastException异常。
动态绑定与静态绑定
- 多态实现过程
- 子类重写父类的方法
- 在程序执行之前方法已经被绑定,针对Java简单的可以理解为程序编译期的绑定(静态绑定)java当中的方法只有final static private 和构造方法是提前绑定的。
- 运行时,根据变量实际引用的对象类型决定调用哪个方法(动态绑定)
- 静态绑定在编译期进行
- Person.say();
- 动态绑定在运行期进行
- Person p = new Person();
- p.say();
- 多态的概念基于对象引用的动态绑定特性
多态应用
- 简单来说,多态是具有多种表现行为能力的特性
- 同一个实现接口,使用不同的实例而执行不同的操作