JAVA有三大特性之--- 多态(个人理解)

来源:互联网 发布:28岁赚千万知乎 编辑:程序博客网 时间:2024/06/05 20:19

2017-6-13

JAVA有三大特性   继承,封装,多态

一直以来对多态不是很了解,今天复习了下多态,写下对多态的理解,初学JAVA  有不对的地方请博友指出

多态的前提条件是1.用父类引用指向子类对象

2.子类重写父类的方法

什么是多态?   

之所以叫多态,就是因为它是一种事物可以有多重表现的形态。在JAVA中的具体表现就是一个类的,通过继承,重写,实现调用同一个方法,可以输出多种结果。

例如:Animal    a1= new cat();

Animal    a2= newdog();

同时调用CAT 和DOG中重写ANIMAL中eat()方法

a1.eat();

a2.eat();

输出的结果会是不同的,一个输出猫吃鱼,一个输出狗吃骨头。

这就是多态,父类的一个方法通过指向子类,调用同一个方法会有不同的结果。

那么什么时候会用到多态?

当多个有共同父类的子类调用同一需要传入子类对象的方法时,我们可以用子类共有的父类作为传入对象,用多态的思想父类引用子类对象可以少很多代码。

那么前面说的调用只是调用具有共通属性的。比如说eat(),play().等等   那么猫或者狗特有的属性,例如 a1.catchMouse(),这个方法时猫特有的属性,animal里并没有这个方法,这是调用就会出现编译错误,那么(父类不具备的)在多态的环境里怎么调用呢?

这种情况需要强制转换,转回去。

       Cat cat  = (CAT)a1;        //这种赋值是成立的相当于    Cat cat  =   Animal  a1= new cat();

cat.catchMouse();              这样才能调用成功。

那么问题又来了, Cat cat  = (CAT)a2,编译时也是成功的,但是运行的时候会出现转换异常,

这是instanceof  的出现就很好的解决了这一个问题,

public static void  testVoice(Animal c){

if ( a1 instanceof Cat){                 //C是一只猫吗  如果是  那么下一步强制转换   

((Cat)c).catchMouse();

}

}

原创粉丝点击