推荐答案
// www.javascriptcn.com code example
class Animal {
void sound() {
System.out.println("Animal makes a sound");
}
}
class Dog extends Animal {
@Override
void sound() {
System.out.println("Dog barks");
}
}
class Cat extends Animal {
@Override
void sound() {
System.out.println("Cat meows");
}
}
public class Main {
public static void main(String[] args) {
Animal myAnimal = new Animal(); // 创建一个Animal对象
Animal myDog = new Dog(); // 创建一个Dog对象
Animal myCat = new Cat(); // 创建一个Cat对象
myAnimal.sound(); // 输出: Animal makes a sound
myDog.sound(); // 输出: Dog barks
myCat.sound(); // 输出: Cat meows
}
}本题详细解读
多态性的定义
多态性(Polymorphism)是面向对象编程的三大特性之一(另外两个是封装和继承)。多态性允许一个接口或方法在不同的对象中有不同的实现。简单来说,多态性允许我们使用父类的引用来调用子类的方法。
多态性的类型
在Java中,多态性主要分为两种类型:
- 编译时多态性(静态多态性):通过方法重载实现。在编译时,编译器根据方法签名来决定调用哪个方法。
- 运行时多态性(动态多态性):通过方法重写实现。在运行时,JVM根据对象的实际类型来决定调用哪个方法。
多态性的实现
在Java中,多态性通常通过以下方式实现:
- 方法重写(Override):子类重写父类的方法。
- 向上转型(Upcasting):将子类对象赋值给父类引用。
代码解析
在推荐答案中,Animal 类是一个父类,Dog 和 Cat 是 Animal 的子类。Dog 和 Cat 类都重写了 Animal 类的 sound() 方法。
在 main 方法中,我们创建了三个对象:
myAnimal是Animal类型的对象。myDog和myCat是Animal类型的引用,但实际指向的是Dog和Cat类型的对象。
当我们调用 sound() 方法时:
myAnimal.sound()调用的是Animal类的sound()方法。myDog.sound()和myCat.sound()调用的是Dog和Cat类中重写的sound()方法。
这就是多态性的体现:尽管 myDog 和 myCat 是 Animal 类型的引用,但在运行时,JVM 会根据实际对象的类型来调用相应的方法。
多态性的优点
- 代码复用:通过继承和多态性,可以减少代码的重复。
- 扩展性:可以在不修改现有代码的情况下,通过添加新的子类来扩展功能。
- 灵活性:可以在运行时决定调用哪个方法,增加了程序的灵活性。