В спецификации 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.Это позволяет совершать виртуальные вызовы достаточно быстро, то есть в постоянное время даже для мегаморфных методов.