问题1. Java中实现多态的机制是什么?
继承允许将对象视为它自己本身的类型或其基类型加以处理,从而使同一份代码可以毫无差别地运行在这些不同的类型之上。其中,多态方法调用允许一种类型表现出与其他相似类型之间的区别,只要这些类型由同一个基类所导出。所以,多态的作用主要体现在两个方面:
- 多态通过分离做什么和怎么做,从另一个角度将接口和实现分离开来,从而实现将改变的事物与未变的事物分离开来;
- 消除类型之间的耦合关系(类似的,在Java中,泛型也被用来消除类或方法与所使用的类型之间的耦合关系)
1. 实现机制
方法的覆盖能够很好地实现多态,但是当使用一个基类引用去调用一个覆盖方法时,到底该调用哪个方法才正确呢?
将一个方法调用同一个方法主体关联起来被称作绑定。若在程序执行前进行绑定,叫做 前期绑定 。但是,显然,这种机制并不能解决上面的问题,因为在编译时编译器并不知道上述基类引用到底指向哪个对象。解决的办法就是 后期绑定 (动态绑定/运行时绑定):在运行时根据对象的具体类型进行绑定。
事实上,在Java中,除了static方法和final方法(private方法属于final方法)外,其他所有的方法都是后期绑定。这样,一个方法声明为final后,可以防止其他人覆盖该方法,但更重要一点是:这样做可以有效地关闭动态绑定,或者说,告诉编译器不需要对其进行动态绑定,以便为final方法调用生成更有效的代码。
基于动态绑定机制,我们就可以编写只与基类打交道的代码了,并且这些代码对所有的导出类都可以正确运行。或者说,发送消息给某个对象,让该对象去断定该做什么事情。
2. 向下转型与运行时类型识别
由于向上转型会丢失具体的类型信息,所以我们可能会想,通过向下转型也应该能够获取类型信息。然而,我们知道向上转型是安全的,因为基类不会具有大于导出类的接口。因此,我们通过基类接口发送的消息都能被接受,但是对于向下转型,我们就无法保证了。
要解决这个问题,必须有某种方法来确保向下转型的正确性,使我们不至于贸然转型到一种错误的类型,进而发出该对象无法接受的消息。在Java中,运行时类型识别(RTTI)机制可以处理这个问题,它保证Java中所有的转型都会得到检查。所以,即使我们只是进行一次普通的加括弧形式的类型转换,再进入运行期时仍会对其进行检查,以便保证它的确是我们希望的哪种类型。如果不是,我们就会得到一个类型转换异常:ClassCastException。
3、多态的应用举例
策略模式;
适配器模式;
引用链接:https://blog.csdn.net/justloveyou_/article/details/52798666
网友评论