当我在java中学习多态概念时,问题就出现了。如下面的代码所示:
public class test {
public static void main(String[] args){
testF(new B());
}
public static void testF(A a){
a.f();
}
}
class A{
public void f(){System.out.println("method in super class");}
}
class B extends A{
public void f(){System.out.println("mehtod in sub class");}
}
testF方法需要一个A类参数,但我们传递一个B类引用,它是A类的子类。编译很高兴接受它,并且因为多态性机制,当我们在引用' a'上调用方法f()时,在"实际类型中声明的方法"会得到的。我的问题是,当我们将一个新的构建对象B传递给testF()时,它已被上传到A类,那么java如何获得它的实际类型呢?
答案 0 :(得分:1)
Java为每个对象保留一个虚方法表(AKA调度表),以便它知道在运行时调用时实际调用的f
。
它还跟踪关于对象的相关元信息,例如它们是什么类......等等。
请注意,在您正在考虑的意义上,实际上并没有提升。运行时执行最少量的安全/类型检查,但除此之外,它使用虚方法表来查找调用时要运行的方法。