- 接口的多种不同的实现方式即为多态。
- 多态性是允许你将父对象设置成为一个或更多的他的子对象相等的技术。
- 我们在程序中定义的引用变量所指向的具体类型和通过该引用变量的方法调用在编程的时候并不确定,当处于运行期间才确定。就是这个引用变量究竟指向哪一个实例对象,在编译期间是不确定的,只有运行期才能确定,这样不用修改源码就可以把变量绑定到不同的类实例上,让程序拥有了多个运行状态,这就是多态。
实际上多态包括动态多态(重写)和静态多态(重载)。
静态多态也称为编译时多态,即在编译时决定调用哪个方法;
静态多态一般是指方法重载;
只要构成了方法重载,就可以认为形成了静态多态的条件;
静态多态与是否发生继承没有必然联系。
public Student{
public void find(){
}
public void find(int a){
}
public void find(int a,int b){
}
}
动态多态也称为运行时多态,即在运行时才能确定调用哪个方法;
形成动态多态必须具体以下条件:
- 必须要有继承的情况存在;
- 在继承中必须要有方法覆盖;
- 必须由基类的引用指向派生类的实例,并且通过基类的引用调用被覆盖的方法;
- 由上述条件可以看出,继承是实现动态多态的首要前提。
public class ParentClass{
public void fun(){
System.out.println("父类fun函数");
}
public class ChildClass extends ParentClass{
public void fun(){
System.out.println("子类fun函数");
}
}
}
我们在前面的学习过程,已经学习到了OOP的封装和继承。
其中封装我们是为了隐藏细节,使代码模块化,而继承是为了代码重用,那么多态呢?我们来看一段需求!
public class Plane{
public abstract void fly();//起飞
public abstract void land();//着陆
public class Copter extends Plane{
public void fly(){
System.out.println("直升机起飞");
}
public void land(){
System.out.println("直升机着陆");
}
}
public class Jet extends Plane{
public void fly(){
System.out.println("喷气式飞机起飞");
}
public void land(){
System.out.println("喷气式飞机着陆");
}
}
public class Test {
public static void main(String[] args) {
Plane p = new Plane();
p.fly();
p.land();
p = new Copter();
P.fly();
p = new Jet();
p.land();
}
我们会发现只要使用new方法,可以让所有传给它的飞机(Plane的子类对象)正常起飞!
可以看到new方法接受的参数是Plane类对象引用,而实际传递给它的都是Plane的子类对象,现在回想一下开头所描述的“多态”,不难理解,我们使用多态便于灵活地扩展我们开发的程序。