java练习题-多态1

2.1.多态练习
编写程序模拟“主人”喂养“宠物”的场景:
提示1:
主人类:Master
宠物类:Pet
宠物类子类:Dog、Cat、Bird
提示2:
主人应该有喂养的方法:feed()
宠物应该有吃的方法:eat()
只要主人喂宠物,宠物就吃。
要求:主人类中只提供一个喂养方法feed(),要求达到可以喂养各种类型的宠物。
编写测试程序:
创建主人对象
创建各种宠物对象
调用主人的喂养方法feed(),喂养不同的宠物,观察执行结果。
通过该案例,理解多态在开发中的作用。
重要提示:feed方法是否需要一个参数,参数选什么类型!!!

注意:在文本中并未多加阐述,代码中有比较详细的注释

1、未使用多态时

public class AnimalTest01 {
    //编写测试程序:
    //创建主人对象
    //创建各种宠物对象
    //调用主人的喂养方法feed(),喂养不同的宠物,观察执行结果。
    public static void main(String[] args) {
        //新建一个主人对象 新建一个宠物对象
        Master m1 = new Master();

        Dog zangao = new Dog();
        //主人喂养宠物
        m1.feed(zangao);
        //输出狗狗喜欢吃骨头!
        //zangao.eat();

        Cat bosi = new Cat();
        m1.feed(bosi);

        Bird yingwu = new Bird();
        m1.feed(yingwu);
    }
}


//主人类:Master
//主人类中只提供一个喂养方法feed(),要求达到可以喂养各种类型的宠物。
class Master {
    //无参构造
    public Master() {
    }

    //喂养方法
    public void feed(Dog d) {
        d.eat();
    }
    public void feed(Cat c) {
        c.eat();
    }
    public void feed(Bird b) {
        b.eat();
    }  
}



//宠物类:Pet 此处宠物类Pet定义了,但在主方法中并未起任何作用
class Pet {
    public void eat() {
        //宠物吃食物
        System.out.println("宠物喜欢吃宠物食物!");
    }
}

//宠物类子类:Dog、Cat、Bird
//宠物应该有吃的方法:eat()
class Dog {
    //狗吃骨头(重写eat方法)
    public void eat() {
        System.out.println("狗狗喜欢啃骨头!");
    }
}

class Cat {
    //猫吃鱼(重写eat方法)
    public void eat() {
        System.out.println("猫咪喜欢吃鱼!");
    }
}

class Bird {
    //鸟吃虫子(重写eat方法)
    public void eat() {
        System.out.println("鸟儿喜欢吃虫子!");
    }
}

2、使用多态

public class AnimalTest01 {
    //编写测试程序:
    //创建主人对象
    //创建各种宠物对象
    //调用主人的喂养方法feed(),喂养不同的宠物,观察执行结果。
    //通过该案例,理解多态在开发中的作用。
    //重要提示:feed方法是否需要一个参数,参数选什么类型!!!
    public static void main(String[] args) {
        //创建一个主人对象m1
        Master m1 = new Master();

        //使用多态,向下转型 将传过来的宠物信息转为对应类型
       
        System.out.println("第一种方式输出:");
        //第一种方式输出
        m1.feed(new Dog());
        m1.feed(new Cat());
        m1.feed(new Bird());

        System.out.println("第二种方式输出:");
        //第二种方式输出
        Dog zangao = new Dog();
        m1.feed(zangao);
        Cat bosi = new Cat();
        m1.feed(bosi);
        Bird yingwu = new Bird();
        m1.feed(yingwu);
    }
}

//主人类
//主人类:Master
//主人应该有喂养的方法:feed()
//主人类中只提供一个喂养方法feed(),要求达到可以喂养各种类型的宠物。
class Master {
    //无参构造
    public Master() {
    }

    //使用父类方法传参 (传入的参数可以通过继承关系通过父类Pet找到子类)
    public void feed(Pet pet) {
        pet.eat();
    }
}


//宠物类:Pet
class Pet {
    public void eat() {
        //宠物吃食物
        System.out.println("宠物喜欢吃宠物食物!");
    }
}

//宠物类子类:Dog、Cat、Bird 子类均继承父类Pet  使用多态的前提:子类继承父类
//宠物应该有吃的方法:eat()
class Dog extends Pet {
    //狗吃骨头(重写eat方法)
    public void eat() {
        System.out.println("狗狗喜欢啃骨头!");
    }
}

class Cat extends Pet {
    //猫吃鱼(重写eat方法)
    public void eat() {
        System.out.println("猫咪喜欢吃鱼!");
    }
}

class Bird extends Pet {
    //鸟吃虫子(重写eat方法)
    public void eat() {
        System.out.println("鸟儿喜欢吃虫子!");
    }
}

使用多态相比较不使用多态的优点:

  • 扩展性更强,如果需要添加新的宠物类型,例如:猪、蛇等
  • 使用多态时,仅仅需要添加宠物类并继承宠物类即可
  • 不使用多态时,除了添加宠物类,还需要在主人类中添加不同参数的feed方法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值