多态的概念
1、面向对象程序设计的三大支柱是封装、继承和多态。
2.多态是面向对象程序设计的一个重要特征,指同一个实体同时具有多种形式,即同一个对象,在不同时刻,代表的对象不一样,指的是对象的多种形态。
3.多态性就是指在不修改程序代码的情况下,就可以改变程序运行时所绑定的具体代码,让程序可以选择多个运行状态。
类型转换
由于,多态本身是一种向上转型,所以我们先了解一下类型转换
强制类型转换(cast)
double Steve_speed = 108.68;
int now_Steve_speed = (int) Steve_speed;
向上转型(upcasting)
将一个父类的引用指向一个子类对象,自动进行类型转换。
使用格式:
父类类型 变量名 = new 子类类型();
如:Animal a = new Dog();
注意:
1.向上转型不要强制转型。
2.父类引用指向的或者调用的方法是子类的方法,这个称为动态绑定。
3.向上转型后父类引用不能调用子类自己的方法。
向下转型(downcasting)
子类引用指向父类引用的子类对象,通俗的说就是子类实例对象赋值给父类引用,然后父类引用又要赋值给子类引用,这个过程就是向下转型。
使用格式:
子类类型 变量名 = (子类类型) 父类变量名;
如:Dog c =(Dog) a;
注意:
1.只能强转父类的引用,不能强转父类的对象。
2.要求父类的引用必须指向的是当前目标类型的对象。
3.当向下转型后,就可以调用子类类型中所有的成员。
多态的前提条件
1.需要有继承关系
2.需要有方法覆盖
3.父类引用指向了子类的实例
实例演示
public class Test {
public static void main(String[] args) {
Animal a=new Cat(); // 向上转型 变成父类型
// 编译时a被认为是Animal类型,运行时被认为是子类型
Animal b=new Dog(); // 向上转型
a.eat(); //调用的是子类的方法
a.work();
Cat c = (Cat)a; //向下转型 变成子类型
Dog d = (Dog)b;
c.eat();
d.eat();
}
}
class Cat extends Animal{
// @Override
public void eat() {
System.out.println("吃鱼");
}
}
class Dog extends Animal{
// @Override
public void eat() {
System.out.println("吃骨头");
}
}
class Animal{
public void eat(){
System.out.println("吃什么");
}
public void work(){
System.out.println("验证a的内部是Animal类型");
}
}
多态的特点
1.可替换性(substitutability):
多态对已存在代码具有可替换性。例如,多态对圆Circle类工作,对其他任何圆形几何体,如圆环,也同样工作。
2.可扩充性(extensibility):
多态对代码具有可扩充性。增加新的子类不影响已存在类的多态性、继承性,以及其他特性的运行和操作。实际上新加子类更容易获得多态功能。例如,在实现了圆锥、半圆锥以及半球体的多态基础上,很容易增添球体类的多态性。
3.接口性(interface-ability):
多态是超类通过方法签名,向子类提供了一个共同接口,由子类来完善或者覆盖它而实现的。
4.灵活性(flexibility):
它在应用中体现了灵活多样的操作,提高了使用效率。
5.简化性(simplicity):
多态简化对应用软件的代码编写和修改过程,尤其在处理大量对象的运算和操作时,这个特点尤为突出和重要。
总结
在面向对象编程的时候,我们遇到的对象通常都会具有多种特性,我们想要实现一个对象的编程过程,就需要用到Java的三大特性。如果说,封装是创造了一个初具人形的发条人偶,继承则是给它装上了工具,而多态则为这个人偶赋予了独有的灵魂和思想。
多态虽然对于初学者来说,有一些难以理解,但其特性动态绑定在实际项目中非常有用,能减少很多繁杂的代码,减轻工作量的同时,其灵活性也大大提高了代码的扩展性,能够避免不同子类的差异,简化程序,使我们的程序更加通用。