1. 多态的实现方式
(1)通过继承实现多态
当一个父类被多个子类继承时,子类可以覆盖父类的方法(通过@Override),从而实现多态。运行时,Java虚拟机会根据对象的实际类型调用相应的方法。
示例代码:
class Animal {
public void makeSound() {
System.out.println("Animal makes a sound");
}
}
class Dog extends Animal {
@Override
public void makeSound() {
System.out.println("Dog barks");
}
}
class Cat extends Animal {
@Override
public void makeSound() {
System.out.println("Cat meows");
}
}
public class PolymorphismExample {
public static void main(String[] args) {
Animal myAnimal = new Dog(); // 父类引用指向子类对象
myAnimal.makeSound(); // 输出:Dog barks
myAnimal = new Cat(); // 父类引用指向另一个子类对象
myAnimal.makeSound(); // 输出:Cat meows
}
}
关键点:
-
Animal是一个父类,Dog和Cat是子类 -
父类引用
myAnimal可以指向子类对象(Dog或Cat) -
调用
makeSound()方法时,Java虚拟机会根据对象的实际类型(运行时类型)调用相应的方法,而不是根据引用类型(编译时类型)。
(2)通过接口实现多态
接口是Java中实现多态的另一种方式。多个类可以实现同一个接口,每个类根据自己的需求实现接口中的方法。运行时,通过接口引用调用方法时,Java虚拟机会根据对象的实际类型调用相应的方法。
示例代码:
interface Animal {
void makeSound();
}
class Dog implements Animal {
@Override
public void makeSound() {
System.out.println("Dog barks");
}
}
class Cat implements Animal {
@Override
public void makeSound() {
System.out.println("Cat meows");
}
}
public class PolymorphismExample {
public static void main(String[] args) {
Animal myAnimal = new Dog(); // 接口引用指向实现类对象
myAnimal.makeSound(); // 输出:Dog barks
myAnimal = new Cat(); // 接口引用指向另一个实现类对象
myAnimal.makeSound(); // 输出:Cat meows
}
}
关键点:
-
Animal是一个接口,Dog和Cat是实现类。 -
接口引用
myAnimal可以指向任何实现类对象。 -
调用
makeSound()方法时,Java虚拟机会根据对象的实际类型调用相应的方法。
2. 多态的原理
多态的实现依赖于动态绑定(Dynamic Binding)或运行时多态(Runtime Polymorphism)。在Java中,方法的调用是在运行时根据对象的实际类型来决定的,而不是在编译时。这意味着即使引用类型是父类,Java虚拟机也会根据对象的实际类型调用相应的方法。

898

被折叠的 条评论
为什么被折叠?



