作者:twinklezai750 | 来源:互联网 | 2024-12-11 13:17
在Java编程中,多态性和向上转型是面向对象编程的重要组成部分,它们使得程序更加灵活和可扩展。下面通过一个具体的例子来解释这两个概念。
首先,我们定义一个表示宠物的基本类 Pet
,它包含两个基本行为:吃(eat()
) 和睡(sleep()
)。然后,我们创建两个继承自 Pet
的子类 Dog
和 Cat
,分别重写了 eat()
方法以体现不同宠物进食的不同方式。此外,Dog
类还新增了一个 bark()
方法,而 Cat
类则增加了一个 sharpenClaws()
方法。
package cn.tedu.animal;
public class AnimalDemo {
public static void main(String[] args) {
// 声明一个 Pet 类型的变量
Pet pet;
// 实际创建的是 Dog 对象
pet = new Dog();
// 调用 eat() 方法,实际执行的是 Dog 类中的 eat() 方法
pet.eat();
// 调用 sleep() 方法,此方法未被重写,因此执行的是 Pet 类中的 sleep() 方法
pet.sleep();
// 向上转型示例
m(new Cat());
m(new Dog());
}
// 定义一个接受 Pet 类型参数的方法
public static void m(Pet pet) {
// 在运行时确定具体是哪个子类对象,从而决定调用哪个子类的方法
pet.eat();
}
}
// 宠物基类
abstract class Pet {
public void eat() {
System.out.println("正在进食...");
}
public void sleep() {
System.out.println("正在休息...");
}
}
// 狗类,继承自 Pet
class Dog extends Pet {
@Override
public void eat() {
System.out.println("大口地吃着...");
}
public void bark() {
System.out.println("汪汪汪...");
}
}
// 猫类,继承自 Pet
class Cat extends Pet {
@Override
public void eat() {
System.out.println("优雅地品尝食物...");
}
public void sharpenClaws() {
System.out.println("磨爪子中...");
}
}
上述代码中,Pet pet = new Dog();
这一行体现了向上转型的概念,即允许将子类对象赋值给父类引用。当通过父类引用调用方法时,实际上会调用子类中覆盖的方法,这就是多态性的体现。最后,我们通过调用 m()
方法并传入不同类型的宠物对象,进一步验证了运行时多态的行为。
输出结果如下:
大口地吃着...
正在休息...
优雅地品尝食物...
大口地吃着...