黑马程序员——Java基础-多态

来源:互联网 发布:json.parse 字符串 编辑:程序博客网 时间:2024/06/11 17:31

------- android培训java培训、期待与您交流! ----------

多态

允许不同类的对象对同一消息做出响应,即同一消息可以根据发送对象的不同采用不同的行为方式。例如:定义一个动物进食方法,这个方法可以接收动物对象的调用,猫调用这个方法是吃鱼,狗调用这个方法是啃骨头。

1.多态的体现

     父类的引用指向了自己的子类对象

     父类的引用也可以接收自己的子类对象    

2.多态的前提

     必须是类与类之间有关系,要么继承,要么实现

     通常还有一个前提,存在覆盖

3.多态的好处

     多态的先大大的提高了代码的扩展性

4.多态的弊端

     提高了扩展性,但是只能使用父类的引用访问父类中的成员

 

通过继承实现多态

class Animal{void eat(){System.out.println("Animal eat");}}class Cat extends Animal{void eat()//覆盖父类方法{System.out.println("Cat eat");}void catchMouse()//特有方法{System.out.println("Cat catchMouse");}}class DuoTaiDemo{    public static void main(String[] args)    {        Animal a=new Cat();//类型提升,向上转型。(byte b=2,int x=b,b转为int型)        a.eat();        //如果想要调用猫的特有方法时,如何操作?        //强制将父类的引用转成子类类型,向下转型。        Cat c=(Cat)a;//向下转型。        c.catchMouse();        //千万不要出现这样的操作,就是将父类对象转成子类类型。        //我们能转换的是父类引用指向了自己的子类对象时,该引用可以被提升,也可以被强制转换。        //多态自始至终都是子类对象在做着变化。//Animal a=new Animal();//Cat c=(Cat)a;不行,动物不能转成猫        //对象多态的实现自始至终都是子类对象在变化        //Animal a=new Animal();这里的a是自己的对象        //Animal a=new Cat();这里的a是子类的引用    }}

通过接口实现多态

interface PCI//PCI插槽是连接主板和各种功能卡的接口{     public void open();     public void close();}class MainBoard{     public void run()     {          System.out.println("MainBoard run");     }     public void usePCI(PCI p)//主板通过PCI插槽来扩充功能     {          if(p!=null)          {               p.open();               p.close();          }              }    }class NetCard implements PCI{     public void open()//重写接口方法     {          System.out.println("netcard open");     }     public void close()//重写接口方法     {          System.out.println("netcard close");     }}class SoundCard implements PCI{     public void open()//重写接口方法     {          System.out.println("soundcard open");     }     public void close()//重写接口方法     {          System.out.println("soundcard close");     }}class DuoTaiDemo{     public static void main (String[] args)     {          MainBoard mb=new MainBoard();          mb.run();          mb.usePCI(null);          mb.usePCI(new NetCard());//匿名对象相当于PCI p=new NetCard(),将p传入          mb.usePCI(new SoundCard());//PCI p接收将其实现的子类对象     }}





0 0