2017-6-13
JAVA有三大特性 继承,封装,多态
一直以来对多态不是很了解,今天复习了下多态,写下对多态的理解,初学JAVA 有不对的地方请博友指出
多态的前提条件是1.用父类引用指向子类对象
2.子类重写父类的方法
什么是多态?
之所以叫多态,就是因为它是一种事物可以有多重表现的形态。在JAVA中的具体表现就是一个类的,通过继承,重写,实现调用同一个方法,可以输出多种结果。
例如:Animal a1= new cat();
Animal a2= new dog();
同时调用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();
}
}