public class TestPolymorphism { public static void main(String[] args) { show(new Dog()); show(new Cat()); show(new Lion()); } public static void show(Animal a){ if(a instanceof Dog){ Dog c=(Dog) a; c.eat(); }else if(a instanceof Cat){ Cat c=(Cat) a; c.eat(); }else if(a instanceof Lion){ Lion c=(Lion) a; c.eat(); } } abstract class Animal{ abstract void eat(); } class Dog extends Animal{ public void eat(){ System.out.println("eating bread..."); } } class Cat extends Animal{ public void eat(){ System.out.println("eating rat..."); } } class Lion extends Animal{ public void eat(){ System.out.println("eating meat..."); } } }这个代码哪里有问题,怎么改?
时间: 2024-02-14 08:17:08 浏览: 141
C#中static void Main(string[] args) 参数示例详解
这段代码使用了 instanceof 运算符和强制类型转换来实现多态,但是这种做法不够优雅,容易出错,并且增加了代码的复杂性。可以使用方法重载和方法覆盖来实现多态,代码如下所示:
```
public class TestPolymorphism {
public static void main(String[] args) {
Animal animal1 = new Dog();
Animal animal2 = new Cat();
Animal animal3 = new Lion();
show(animal1);
show(animal2);
show(animal3);
}
public static void show(Animal a) {
a.eat();
}
static abstract class Animal {
abstract void eat();
}
static class Dog extends Animal {
public void eat() {
System.out.println("eating bread...");
}
}
static class Cat extends Animal {
public void eat() {
System.out.println("eating rat...");
}
}
static class Lion extends Animal {
public void eat() {
System.out.println("eating meat...");
}
}
}
```
这段代码使用了 Animal 类型的变量来引用不同的动物对象,并且调用了 Animal 类的 eat() 方法,具体的实现由子类来完成。这样可以避免使用 instanceof 和强制类型转换,代码更加简洁清晰。
阅读全文