面试题答案
一键面试向上转型后方法调用规则
在Java多态中,向上转型(将子类对象赋值给父类引用)后,方法调用遵循“动态绑定”规则,即Java虚拟机在运行时根据对象的实际类型来决定调用哪个方法。具体来说:
- 编译期:编译器根据引用变量的声明类型来检查方法是否存在。
- 运行期:JVM根据对象的实际类型来决定调用哪个方法。如果子类重写了父类的方法,那么会调用子类重写后的方法;如果子类没有重写,就调用父类的方法。
代码示例
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 animal1 = new Dog(); // 向上转型
Animal animal2 = new Cat(); // 向上转型
animal1.makeSound(); // 实际调用Dog类的makeSound方法
animal2.makeSound(); // 实际调用Cat类的makeSound方法
}
}
在上述代码中,animal1
和animal2
都是Animal
类型的引用,但实际指向的是Dog
和Cat
对象。在调用makeSound
方法时,JVM根据对象的实际类型(Dog
和Cat
)来调用它们各自重写后的makeSound
方法,而不是Animal
类中的方法。