一、概述
1、面向对象程序设计的三大支柱是封装、继承和多态。
2、对于多态的基础理解:
事物存在多种形态,现实事物经常会体现出很多种形态。例如猫属于猫科动物,狗属于犬科动物,但猫与狗都是属于动物,但同时他们也分别属于自己的动物类别,如此看来,这就体现了动物表现出的多种形态。这样的介绍有助于我们去理解Java中的多态。
3、Java作为面向对象的语言,同样可以描述一个事物的多种形态。例如,Cat类继承了Animal类,一个Cat的对象既是Cat,也是Animal。
4、多态意味着父类型的变量可以引用子类型的对象。
5、多态是同一个行为具有多个不同表现形式或形态的能力;多态就是同一个接口,使用不同的实例而执行不同操作。
6、多态一般分为两种:重写式和重载式多态
二、背景知识
1、继承关系使一个子类能继承父类的特征,并且附加一些新特征。子类使它的父类的特殊化,每个子类的实例都是其父类的实例,但是反过来不成立。例如:每个圆都是一个几何对象,但并非每个几何对象都是圆。因此,总可以将子类的实例传给需要父类型的参数。
2、实现多态的前提条件:
(1)继承的存在,继承是多态的基础,没有继承就没有多态。
(2)子类重写父类的方法,多态下会调用子类重写后的方法。
(3)父类引用变量指向子类对象,涉及子类到父类的类型转换。
三、详述
1、向上转型和向下转型
(1)向上转型
将一个父类的引用指向一个子类对象,自动进行类型转换。
使用格式:
父类类型 变量名 = new 子类类型();
如:Animal a = new Cat();
注意:
a.向上转型不要强制转型。
b.父类引用指向的或者调用的方法是子类的方法,这个称为动态绑定。
c.向上转型后父类引用不能调用子类自己的方法。
(2)向下转型
子类引用指向父类引用的子类对象,通俗的说就是子类实例对象赋值给父类引用,然后父类引用又要赋值给子类引用,这个过程就是向下转型。
使用格式:
子类类型 变量名 = (子类类型) 父类变量名;
如:Cat c =(Cat) a;
注意:
a.只能强转父类的引用,不能强转父类的对象。
b.要求父类的引用必须指向的是当前目标类型的对象。
c.当向下转型后,就可以调用子类类型中所有的成员。
(3)实例
public class Keeper {
public void feed(Animal animal){
animal.eat();
}
}
public class Test {
public static void main(String[] args) {
Keeper GodXiu = new Keeper();
Animal snake = new Snake();
Animal tiger = new Tiger();
GodXiu.feed(snake);
GodXiu.feed(tiger);
}
}
四、小结
1、多态性是面向对象编程的又一个重要特征,它是指在父类中定义的属性和方法被子类继承之后,可以具有不同的数据类型或表现出不同的行为,这使得同一个属性或方法在父类及其各个子类中具有不同的含义。
2、为什么要用多态
(1)多态的使用提高了代码的维护性;
(2)多态的使用也提高了代码的扩展性;
(3)降低了代码的耦合度。