java学习第二天 java多态和动态绑定

2017-11-14 07:04:30

多态存在的三个必要条件:要有继承、要有重写、父类变量引用子类对象。 当使用多态方式调用方法时: 首先检查父类中是否有该方法,如果没有,则编译错误;如果有,则检查子类是否覆盖了该方法。 如果子类覆盖了该方法,就调用子类的方法,否则调用父类方法。 从上面的例子可以看出,多态的一个好处是:当子类比较多时,也不需要定义多个变量,可以只定义一个父类类型的变量来引用不同子类的实例。请再看下面的一个例子

package demo;

public class Demo {

    public static  void  main(String [] args)
    {
        Master ma = new Master();
        ma.feed(new Animal(),new Food());
        ma.feed(new Cat(),new Fish());
        ma.feed(new Dog(),new Bone());
    }

}

class Animal{

    public  void eat(Food f)
    {
        System.out.println("我是一个小动物,正在吃"+f.getFood());
    }
}

class Cat extends Animal{
    @Override
    public void  eat(Food f)
    {
        System.out.println("我是一直猫咪,我正在吃"+f.getFood());
    }
}

class Dog extends  Animal{
    @Override
    public void eat(Food f)
    {
        System.out.println("我是一直小狗,正在吃"+f.getFood());
    }
}
class Food{

    public String getFood()
    {
        return "食物";
    }
}

class  Fish extends Food{
    @Override
    public String getFood()
    {
        return "鱼" ;
    }
}

class  Bone extends Food{
    @Override
    public String getFood()
    {
        return "骨头";
    }
}

class Master{

    public void feed(Animal an,Food f)
    {
        an.eat(f);
    }
}


运行结果:
我是一个小动物,正在吃事物
我是一只小猫咪,正在吃鱼
我是一只狗狗,正在吃骨头

Master 类的 feed 方法有两个参数,分别是 Animal 类型和 Food 类型,因为是父类,所以可以将子类的实例传递给它,这样 Master 类就不需要多个方法来给不同的动物喂食。

你打算打赏多少钱呢?

打赏
(微信扫一扫)