java如何确定对象的实际类型?

时间:2016-09-26 02:28:56

标签: java polymorphism

当我在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如何获得它的实际类型呢?

1 个答案:

答案 0 :(得分:1)

Java为每个对象保留一个虚方法表(AKA调度表),以便它知道在运行时调用时实际调用的f

它还跟踪关于对象的相关元信息,例如它们是什么类......等等。

请注意,在您正在考虑的意义上,实际上并没有提升。运行时执行最少量的安全/类型检查,但除此之外,它使用虚方法表来查找调用时要运行的方法。