(30)多态
一、多态引入:可以理解为事物存在的多种体现形态
动物:猫,狗
动物 x=new 猫();
二、
①多态的体现
父类的引用指向了自己的子类对象
父类的引用也可以接收自己的子类对象
②多态的前提
必须是类与类有关系,如继承和实现
通常存在覆盖。
③多态的好处
大大提高了程序的拓展性
④多态的弊端
只能访问父类的引用,访问父类中的成员
三、应用
父类:
public abstract class Animal {
public abstract void eat();
}
子类:
public class Cat extends Animal {
@Override
public void eat() {
// TODO Auto-generated method stub
System.out.println("吃鱼");
}
public void catchMouse() {
System.out.println("捕鼠");
}
}
子类:
public class Dog extends Animal {
@Override
public void eat() {
// TODO Auto-generated method stub
System.out.println("吃骨头");
}
public void lookHome() {
System.out.println("看家");
}
}
子类:
public class Pig extends Animal {
@Override
public void eat() {
// TODO Auto-generated method stub
System.out.println("吃饲料");
}
public void gongDi() {
// TODO Auto-generated method stub
System.out.println("拱地");
}
}
①父类的引用指向了自己的子类对象:类型提升,可以调用父类就有的方法,不能调用子类对象独有的方法
Animal a0=new Cat();//类型提升,向上转型(转为父类),继承:动物-->猫,向上转型:猫-->动物
function(a0);
public static void function(Animal a) // 父类 a=new 子类();根据主函数:Animal a0=new Cat();
{
a.eat();
}
输出:捕鼠
///new 子类()就可以查看不同动物子类吃东西的特有方法
②强制类型转换,调用子类的独有方法
如果想要调用猫的特有方法,如何操作?
* 注意不能Cat c=new Cat(),因为这又创建了新对象,操作的不是原有对象。
* 做法:强制将父类引用,转化为子类类型。
Animal a0=new Cat();
Cat c=(Cat)a0; c.catchMouse(); 简单理解:我要一个动物,你给我一只猫对象,猫is a动物,通过向下类型转换,转化为猫,调用猫独有(如捕鼠)的方法
注意不能如下做法:
Animal a=new Animal();
Cat c=(Cat)a;
错误原因:我要一个动物,你给我一个动物,这个动物不一定是猫,所以不能强转为猫
③如果想在function()方法中对猫强制类型转换,就可以在在主函数中减少代码
public static void function(Animal a) // 父类 a=new 子类();
{
a.eat();
Cat c=(Cat)a;
c.catchMouse();
}
如果主函数中创建的是new Cat(),这个function方法没问题,若创建了 new Dog(),则会出现错误: com.duotai.Dog cannot be cast to com.duotai.Cat,通过④对③方法进行修改
④instanceof
这样就可随意创建对象,进行调用了
public static void function(Animal a) // 父类 a=new 子类();
{
a.eat();
/*
* 下面代码需要注意的是:不能写 a instanceof Animal,这是true命题,不会执行其他的了
*/
if(a instanceof Cat) {
Cat c=(Cat)a;
c.catchMouse();
}
else if(a instanceof Dog) {
Dog c=(Dog)a;
c.lookHome();;
}
else {
Pig c=(Pig)a;
c.gongDi();
}
}