A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

从上图看,动物包含猫,狗和猪。反过来说,猫,狗和猪都也是动物。这就是一种对象的不同体现也就是对象的多态性。

多态性的作用:提高代码的课扩展性。

下面通过一个需求来理解一下对象的多态性:让学生来喂猫,狗。

不利用对象的多态性来实现,代码:

package itheiomatest;

public class Main {

    public static void main(String[] args) {
        Student s=new Student("张硕");
        Cat c=new Cat("猫");
        Dog d=new Dog("狗");

        s.FeedCat(c);
        s.FeedDog(d);
    }

}
//父类 动物
abstract class Animal{
    public String name;
    public Animal(String name){
        this.name=name;
    }
    public abstract void Eat();

}
//子类 狗
class Dog extends Animal{


    public Dog(String name) {
        super(name);
    }

    @Override
    public void Eat() {
        System.out.println("吃骨头");

    }

}
//子类 猫
class Cat extends Animal{

    public Cat(String name) {
        super(name);
        // TODO Auto-generated constructor stub
    }

    @Override
    public void Eat() {
        System.out.println("吃鱼");

    }

}
//学生类
class Student{
    public String name;
    public Student(String name){
        this.name=name;

    }
    public void FeedCat(Cat a){
        System.out.println("我是学生"+name+"我在喂"+a.name);
            a.Eat();
    }
    public void FeedDog(Dog a){
        System.out.println("我是学生"+name+"我在喂"+a.name);
            a.Eat();
    }
}

分析上面的代码可以看出,在学生类里面有两个方法,一个喂猫的方法,一个喂狗的方法。
如果这个时候再让我们喂一下猪,我们得在学生类里面再写一个FeedPig()的方法。这样如果再增加喂别的动物的方法呢?会不会出现许多重复的喂小动物的方法?这就会提高代码的冗余程度。该怎么办呢?

分析一下:因为 猫狗和猪都属于动物,所以我们可以 (动物 猫=new 猫()); 也就是可以用父类创建子类对象。所以代码可以这样写:

package itheiomatest;

public class Main {

    public static void main(String[] args) {
        Student s=new Student("张硕");
        s.FeedAnimal(new Dog("狗"));
        s.FeedAnimal(new Cat("猫"));
    }

}
//抽象父类 狗

abstract class Animal{
    public String name;
    public Animal(String name){
        this.name=name;
    }
    //因为每种动物都有吃的动作,但是吃的东西却不一样,所以我们把它写为抽象方法。
    public abstract void Eat();

}
//子类狗
class Dog extends Animal{

    public Dog(String name) {
        super(name);
    }

    @Override
    public void Eat() {
        System.out.println("吃骨头");

    }

}
//子类猫
class Cat extends Animal{

    public Cat(String name) {
        super(name);
    }

    @Override
    public void Eat() {
        System.out.println("吃鱼");

    }

}

class Student{
    public String name;
    public Student(String name){
        this.name=name;
    }
    //在这里我们只需要写一个喂动物的方法,然后把动物的对象传进去。
    public void FeedAnimal(Animal a){
        System.out.println("我是学生"+name+"我在喂"+a.name);
        a.Eat();
    }
}

总结多态性的三个特征:有继承,又重写,父类引用指向子类对象。

3 个回复

倒序浏览
这是我从我的博客拷过来的  没图
回复 使用道具 举报
楼主打算用多长时间完成博客?
回复 使用道具 举报
vilion 发表于 2015-6-13 21:59
楼主打算用多长时间完成博客?

学一点写一点    。。。。以前是为了凑数,写了几篇之后就发现写博客的好处了。加深理解
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马