Java vtable для супер методов - PullRequest
       31

Java vtable для супер методов

0 голосов
/ 04 декабря 2018

Когда у нас есть два класса:

class Foo {
    void foo() {
        System.out.println("foo");
    }
}

и:

class Bar extends Foo{
    void bar() {
        System.out.println("bar");
    }
}

Сохраняет ли объект Bar clazz ссылки на методы foo () и bar () в vtable или там?просто ссылка на метод bar () в vtable of Bar и для доступа к методу foo () jvm обращается к объекту Bar clazz, затем к объекту Foo clazz и затем находит метод foo () в своей vtable?Это больше похоже на: enter image description here или что: enter image description here Или, может быть, это не описано в спецификации и может зависеть от реализации JVM?

1 Ответ

0 голосов
/ 04 декабря 2018

В спецификации JVM не прописано, как реализовывать вызовы виртуальных методов.Это даже не относится к понятию vtable .Реализация JVM может выбирать тот или иной путь, если она ведет себя как ожидалось.

Что касается HotSpot JVM, эталонной реализации виртуальной машины Java SE, она работает так же, как на первом изображении, т.е.класс содержит все его виртуальные методы, включая унаследованные.

     ------------------      ------------------ 
    | Foo.class vtable |    | Bar.class vtable |
    |------------------|    |------------------|
    | clone            |    | clone            | \
    | equals           |    | equals           | | java.lang.Object
    | hashCode         |    | hashCode         | / virtual methods
    | ...              |    | ...              |
    | foo              |    | foo              | } Foo virtual methods
     ------------------     | bar              | } Bar virtual methods
                             ------------------

Такой макет гарантирует, что все потомки класса Foo будут иметь ссылку на метод foo с тем же индексом в vtable.Это позволяет совершать виртуальные вызовы достаточно быстро, то есть в постоянное время даже для мегаморфных методов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...