在Java类中实现多态的方式
- 方法重写(Override):
- 发生在子类与父类之间,子类重写父类的方法。当通过父类引用调用重写的方法时,实际执行的是子类的方法实现,这体现了运行时多态。
- 重写要求方法名、参数列表、返回类型(或是其子类型,在Java 5.0及之后)必须与父类被重写的方法相同,访问权限不能比父类中被重写的方法更严格。
- 方法重载(Overload):
- 在同一个类中,方法名相同但参数列表不同(参数个数、类型或顺序不同)。调用时根据传入的参数来决定调用哪个重载方法,这体现了编译时多态。
代码示例
class Animal {
public void makeSound() {
System.out.println("Animal makes a sound");
}
}
class Dog extends Animal {
// 重写makeSound方法
@Override
public void makeSound() {
System.out.println("Dog barks");
}
}
class Cat extends Animal {
// 重写makeSound方法
@Override
public void makeSound() {
System.out.println("Cat meows");
}
}
class SoundMaker {
// 方法重载
public void makeSound(Animal animal) {
animal.makeSound();
}
public void makeSound(Dog dog) {
dog.makeSound();
}
}
重写与重载在实现多态过程中的作用
- 重写:
public class Main {
public static void main(String[] args) {
Animal animal1 = new Dog();
Animal animal2 = new Cat();
animal1.makeSound();// 实际执行Dog的makeSound方法
animal2.makeSound();// 实际执行Cat的makeSound方法
}
}
animal1
和animal2
虽然声明为Animal
类型,但由于它们实际指向的是Dog
和Cat
对象,调用makeSound
方法时会执行子类重写后的方法,体现了运行时多态。
- 重载:
public class Main2 {
public static void main(String[] args) {
SoundMaker soundMaker = new SoundMaker();
Animal animal = new Dog();
Dog dog = new Dog();
soundMaker.makeSound(animal);
soundMaker.makeSound(dog);
}
}
- 根据传入参数的不同(
Animal
类型和Dog
类型),编译器会在编译时决定调用哪个makeSound
方法,体现了编译时多态。