(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();
	}
		
	
}

posted @ 2017-07-08 10:36  测试开发分享站  阅读(115)  评论(0)    收藏  举报