概述
我们都知道面对对象有四个基本特性:抽象、封装、继承、多态。这四个特性,概括起来可以这样理解:抽象、封装、继承是多态的基础,多态是抽象、封装、继承的抽象。多态是Java中非常重要的一部分,所以今天来谈下多态。
什么是多态
不同的对象对同意消息做出响应就是多态。就像上课铃响了,上体育课的学生就去上操场上体育课,上数学课的学生就坐在教室里面数学课。
多态的作用
简单讲就是解耦,再详细讲就是:多态是设计模式的基础。不能说所有的设计模式都是使用了多态,但23种中的很大一部分都是基于多态的。
多态存在的三个条件
1、有几继承关系
2、子类重写父类方法
3、父类引用指向子类对象
补充下第二条,既然多态存在就有一定要有子类重写父类方法这个一条件。那么以下三种方法是没有办法表现出多态的特性的(不能被重写)
1.static方法。因为被static修饰过的方法是属于类的, 而不是属于实例的。
2.final方法。因为被final修饰过的方法无法被子类重写。
3.private方法与protected方法。前者是因为被private修饰过的方法子类不可见,后者是因为,尽管被protected修饰的方法可以被子类见到,也可以被子类重写,但是它是不能被外部所引用的,一个不能被外部所引用的方法怎么能来 谈多态呢。
多态的分类
1.编辑时多态,就方法的重载,从JVM的角度来讲,这是一种静态分派。
2.运行时多态,就方法的重写,从JVM的角度来讲,这是一种动态分派。
分析多态问题的几条原则
如果不去理解多条的原理,就从使用的角度来讲,以个人的学习,工作这几年经验,总结出了多态无非三句话。
比如,我们有一个父类father,有一个子类children。
1.向上转型是自动的。即 Father f= new children()是自动的,不需要强转。
2.向下转型是强转的。即 Children c=new Father()是无法编译通过的。必须要Children c=(Children) new Father,让父类知道,他具体要转成哪个子类。
3.父类引用指向子类对象,子类重写了父类的方法,调用父类的方法,实际上调用是子类重写了的父类的该方法。即Father f= new children(),f.Children实际上调用的是Children中的toString方法。