多态的弊端:不能访问子类的特有功能
题目:
1.定义狗类
属性:
年龄,颜色
行为:
eat(String something)(something表示吃的东西)
看家lookHome方法(无参数)
2.定义猫类
属性:
年龄,颜色
行为:
eat(String something)方法(something表示吃的东西)
逮老鼠catchMouse方法(无参数)
3.定义Person类//饲养员
属性:
姓名,年龄
行为:
keepPet(Dog dog,String something)方法
功能:喂养宠物狗,something表示喂养的东西
行为:
keepPet(Cat cat,String something)方法
功能:喂养宠物猫,something表示喂养的东西
生成空参有参构造,set和get方法
4.定义测试类(完成以下打印效果):
keepPet(Dog dog,String somethind)方法打印内容如下:
年龄为30岁的老王养了一只黑颜色的2岁的狗
2岁的黑颜色的狗在吃骨头
keepPet(Cat cat,String somethind)方法打印内容如下:
年龄为25岁的老李养了一只灰颜色的3岁的猫
3岁的灰颜色的猫在吃鱼
首先,涉及到javabean类,先画图画出它们的继承关系(根据继承结构从下往上)
接下来开始编写代码(根据继承结构从上往下)
Dog和Cat都是Animal的子类,以上案例中针对不同的动物,定义了不同的keepPet方法,过于繁琐,我们将它简化,直接使用Animal类为keepPet的第一个参数,同时保障其Dog类和Cat类中的特有方法仍可以使用。因此我们可以利用多态来简化题目中的第三、四点。
Animal类:
//属性:
//年龄,颜色
//行为:
//eat(String something)(something表示吃的东西)
public class Animal {
private int age;
private String color;
public Animal() {
}
public Animal(int age, String color) {
this.age = age;
this.color = color;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
//eat方法
//eat(String something)(something表示吃的东西)
public void eat(String something) {
System.out.println("动物在吃" + something);
}
}
Dog类:
public class Dog extends Animal {
public Dog() {
}
public Dog(int age, String color) {
super(age, color);
}
//需重新定义看家lookHome方法(无参数)
public void lookHome() {
System.out.println("狗在看家");
}
//需根据第四点要求的输出语句"2岁的黑颜色的狗在吃骨头"改写eat方法
@Override
public void eat(String something) {
System.out.println(getAge() + "岁的" + getColor() + "颜色的狗在吃" + something);
}
}
Cat类:
public class Cat extends Animal {
public Cat() {
}
public Cat(int age, String color) {
super(age, color);
}
//需重新定义逮老鼠catchMouse方法(无参数)
public void catchMouse() {
System.out.println("猫在抓老鼠");
}
//需根据第四点要求的输出语句"3岁的灰颜色的猫在吃鱼"改写eat方法
@Override
public void eat(String something) {
System.out.println(getAge() + "岁的" + getColor() + "颜色的猫在吃" + something);
}
}
Person类:
public class Person {
private String name;
private int age;
public Person() {
}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
//3.定义Person类
//属性:
//姓名,年龄
//行为:
//keepPet(Dog dog,String something)方法
//功能:喂养宠物狗,something表示喂养的东西
//行为:
//keepPet(Cat cat,String something)方法
//功能:喂养宠物猫,something表示喂养的东西
//生成空参有参构造,set和get方法
//4.定义测试类(完成以下打印效果):
//keepPet(Dog dog,String somethind)方法打印内容如下:
//年龄为30岁的老王养了一只黑颜色的2岁的狗
//2岁的黑颜色的狗在吃骨头
//keepPet(Cat cat,String somethind)方法打印内容如下:
//年龄为25岁的老李养了一只灰颜色的3岁的猫
//3岁的灰颜色的猫在吃鱼
//要求如上↑
//Dog和Cat都是Animal的子类
//以上案例中针对不同的动物,定义了不同的keepPet方法,过于繁琐
//我们将它简化,直接使用Animal类为keepPet的第一个参数
//同时保障其Dog类和Cat类中的特有方法仍可以使用
public void keepPet(Animal a, String something) {
//判断是Dog还是Cat
if (a instanceof Dog d) {
System.out.println("年龄为" + getAge() + "岁的" + getName()
+ "养了一只" + d.getColor() + "颜色的" + d.getAge() + "岁的狗");
d.eat(something);
} else if(a instanceof Cat c) {
System.out.println("年龄为" + getAge() + "岁的" + getName()
+ "养了一只" + c.getColor() + "颜色的" + c.getAge() + "岁的猫");
c.eat(something);
} else {
System.out.println("没有这种动物");
}
}
}
最后编写测试类Test:
public class Test {
public static void main(String[] args) {
//创建饲养员对象
Person p = new Person("老李", 36);
//创建Dog和Cat对象
Dog d = new Dog(2, "黑");
Cat c = new Cat(3, "灰");
//运行方法
p.keepPet(d, "骨头");
p.keepPet(c, "鱼");
}
}
运行结果:
符合要求