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方法