面试题答案
一键面试动态绑定原理
- 多态基础:在Java中,多态允许通过父类的引用调用子类的方法。这基于继承和方法重写机制。
- 动态绑定定义:动态绑定是指在运行时根据对象的实际类型来确定调用哪个方法,而非在编译时根据引用类型确定。
- JVM确定调用方法流程:
- 编译期:编译器检查引用类型,确定该引用类型是否包含要调用的方法。若不存在,编译报错。例如,父类
Animal
有makeSound
方法,子类Dog
继承Animal
并重写makeSound
。当Animal animal = new Dog();
时,编译器检查Animal
类是否有makeSound
方法。 - 运行期:JVM在运行时根据对象的实际类型(堆内存中对象的真实类型)来决定调用哪个类的方法。JVM在对象的内存布局中有一个指针(vtable指针,虚方法表指针),指向该对象所属类的虚方法表。虚方法表存储了该类及其父类中所有可重写方法的实际地址。当调用方法时,JVM通过vtable指针找到对应的虚方法表,再根据方法签名找到具体要执行的方法代码。比如
animal.makeSound();
,运行时JVM根据animal
实际指向的Dog
对象的vtable指针,在Dog
类的虚方法表中找到makeSound
方法的实际地址并执行。
- 编译期:编译器检查引用类型,确定该引用类型是否包含要调用的方法。若不存在,编译报错。例如,父类
实际开发应用场景
- 图形绘制系统:假设有一个
Shape
父类,包含draw
方法,子类Circle
、Rectangle
继承Shape
并重写draw
方法。在系统中可以定义Shape shape = new Circle();
或Shape shape = new Rectangle();
,通过shape.draw();
实现不同图形的绘制,根据shape
实际指向的对象类型调用相应子类的draw
方法。 - 游戏开发中的角色行为:有
Character
父类,包含performAction
方法,子类Warrior
、Mage
等继承Character
并重写performAction
。游戏中可以使用Character character = new Warrior();
或Character character = new Mage();
,根据角色实际类型执行不同的动作,如战士攻击、法师施法等,通过character.performAction();
实现动态行为。