(1)定义一个抽象类Animal,包含一个抽象方法eat()。(2)定义三个具体的动物类:Bird、Fish、Cat,它们都继承Animal类,并实现eat()方法。 (3)定义一个接口IPet,包含两个方法:play(和 getName()。(4)在Cat类中实现IPet接口,并实现play()方法和 getName()方法。 (5)编写一个测试类,在主函数中,创建一个数组,将其中的元素分别指向Bird、Fish、Cat对象,并通过循环调用eat()方法和play()方法。要求程序能够正确输出每种动物的eat()方法和只有Cat对象的play()方法。
时间: 2024-03-20 15:42:43 浏览: 115
Java面向对象(高级)- 抽象类与抽象方法(或abstract关键字)
好的,下面是实现代码:
```
// 定义抽象类Animal
abstract class Animal {
abstract void eat();
}
// 具体的动物类
class Bird extends Animal {
@Override
void eat() {
System.out.println("Bird is eating seeds.");
}
}
class Fish extends Animal {
@Override
void eat() {
System.out.println("Fish is eating flakes.");
}
}
class Cat extends Animal implements IPet {
private String name;
Cat(String name) {
this.name = name;
}
@Override
void eat() {
System.out.println("Cat is eating fish.");
}
@Override
public void play() {
System.out.println(name + " is playing with a ball of yarn.");
}
@Override
public String getName() {
return name;
}
}
// 定义接口IPet
interface IPet {
void play();
String getName();
}
// 测试类
public class Main {
public static void main(String[] args) {
Animal[] animals = new Animal[3];
animals[0] = new Bird();
animals[1] = new Fish();
animals[2] = new Cat("Luna");
for (Animal animal : animals) {
animal.eat();
if (animal instanceof Cat) {
IPet pet = (IPet) animal;
pet.play();
}
}
}
}
```
在上面的代码中,我们定义了一个抽象类`Animal`,包含了一个抽象方法`eat()`。然后我们又定义了三个具体的动物类:`Bird`、`Fish`、`Cat`,它们都继承了`Animal`类并实现了`eat()`方法。接着,我们定义了一个接口`IPet`,包含了`play()`和`getName()`方法。最后,在`Cat`类中实现了`IPet`接口并实现了`play()`和`getName()`方法。
在测试类`Main`中,我们创建了一个长度为3的`Animal`数组,将其中的元素分别指向`Bird`、`Fish`、`Cat`对象。然后我们通过循环调用`eat()`方法和`play()`方法,并且在循环中判断当前`Animal`对象是否为`Cat`类型,如果是,则将其强制转换为`IPet`类型并调用`play()`方法。最终,程序能够正确输出每种动物的`eat()`方法和只有`Cat`对象的`play()`方法。
输出结果为:
```
Bird is eating seeds.
Fish is eating flakes.
Cat is eating fish.
Luna is playing with a ball of yarn.
```
阅读全文