猫狗案例练习多态版,实现向上转型和向下转型
时间: 2024-11-20 10:37:09 浏览: 7
在Java中,猫(Cat)和狗(Dog)可以被视为宠物(Pet)类的子类。我们可以通过多态来演示向上转型(Upcasting)和向下转型(Downcasting)。这里是一个简单的例子:
首先,我们定义一个`Pet`接口或抽象类:
```java
// 定义一个Pet接口
interface Pet {
void makeSound();
}
// 宠物抽象类
abstract class Animal implements Pet {
protected String name;
public Animal(String name) {
this.name = name;
}
@Override
public void makeSound() {
System.out.println("Animal makes a generic sound.");
}
// 返回当前动物的类型
public Class<? extends Pet> getType() {
return getClass();
}
}
// 猫类
class Cat extends Animal {
public Cat(String name) {
super(name);
}
@Override
public void makeSound() {
System.out.println(name + " meows.");
}
}
// 狗类
class Dog extends Animal {
public Dog(String name) {
super(name);
}
@Override
public void makeSound() {
System.out.println(name + " barks.");
}
}
```
现在,我们可以进行向上转型和向下转型:
```java
public class Main {
public static void main(String[] args) {
// 向上转型 - 创建一个Pet类型的数组并存储Cat对象
Pet[] pets = {new Cat("Kitty"), new Dog("Buddy")};
for (Pet pet : pets) {
pet.makeSound(); // 可以直接调用makeSound(), 因为它们都是Pet接口的实现
// 向下转型 - 遍历并显示每个动物的具体类型和声音
if (pet instanceof Cat) {
Cat cat = (Cat) pet; // 上转型后,我们可以将它转换为更具体的类型
System.out.println("This is a " + cat.getType().getSimpleName() + ": " + cat.makeSound());
} else if (pet instanceof Dog) {
Dog dog = (Dog) pet;
System.out.println("This is a " + dog.getType().getSimpleName() + ": " + dog.makeSound());
}
}
}
}
```
在这个例子中,`makeSound()`方法的多态性允许我们在不知道具体类型的情况下调用。向上转型展示了`Pet`接口与`Cat`、`Dog`之间的通用关系,而向下转型则让我们可以在适当的时候利用特定类型的特性和方法。
阅读全文