Как VTBLs реализованы в Java? - PullRequest
0 голосов
/ 12 ноября 2009

Запуск этого кода:

class A {                                                                       
  public int x;                                                                 
  public A() {                                                                  
    function();                                                                 
  }                                                                             
  public void function() {                                                      
    this.x = 20;                                                                
  }                           
  public void printhey() { System.out.println("Hey"); }                                             
}                                                                               

class B extends A {   
  public B() {
    super();
    printhey(); 
  }                                                          
  public void function() {                                                      
    this.x = 50;                                                                
  }                                                                             
}                                                                               

public class tmp {                                                              
  public static void main(String[] args) {                                      
    System.out.println((new B()).x);                                            
  }                                                                             
}     

распечатывает:

Hey
50

Кто создает VTBL? в конструкторе A function уже установлен на B. Но в конструкторе B, printhey установлен на A.

Ответы [ 3 ]

6 голосов
/ 12 ноября 2009

"VTBL" - это артефакт языков, которые работают со структурами хранения. То есть в C ++ вы можете с достаточной степенью точности точно определить, как класс будет отображаться в ОЗУ.

Java не имеет дело со структурами хранения, она имеет дело со структурами данных. Вы можете легко использовать структуру хранения в качестве структуры данных, но обратное не так тривиально. Если у вас есть копия журнала BYTE, выпущенная в начале 1991 года, вы даже можете найти статью, в которой я превозносил преимущества отображения структур данных C ++ на структуры хранения, используемые ядром Commodore Amiga OS ROM (Exec). Тогда фактически термин «структура данных» использовался как некий универсальный элемент, так как мы все еще беспокоились о том, как вещи точно поместятся в память.

Структуры данных обычно используются алгоритмами. Структуры хранения более тесно связаны с внутренними реализациями и сериализованными формами. Фактическое выполнение программы требует немного и того и другого, но структуры хранения, лежащие в основе структуры данных Java, должны быть непрозрачными. Это большая часть того, что делает Java «пиши один раз, беги куда угодно». Если вам не нужно беспокоиться о размере и байтовой ориентации вещей, вам не нужно загружать ваше приложение с помощью «пробок» и калькуляторов смещения памяти.

Некоторые языки программирования не любят прямых и циклических ссылок. Java было бы трудно обойтись без них. Однако есть разница между жесткой ссылкой на код и ссылкой на сигнатуру метода, которая привязана к байт-коду и которая (возможно) в конечном итоге будет JIT-скомпилирована в машинный код. Или даже повторно оптимизирован и перекомпилирован, в некоторых из более продвинутых JVMS. Все это сводится к тому, что у вас есть несколько проходов над классом, где один устанавливает словарь, а другой подключает связи. Включая автоматическое наложение, если необходимо.

2 голосов
/ 12 ноября 2009

В Java нет понятия VTBL; значит, нет ВТБЛ.

Созданный объект является новым B (), и B имеет (к тому времени) функцию (определенную в B, так как она переопределяет A) и printhey (унаследованную от A). Таким образом, X присваивается 50 - конструктору A, вызываемому через конструктор B, выполняет заданную операцию, вызывая функцию (из B). Затем мы вызываем 'printhey' (строка после super () в B), которая вызывает унаследованную функцию fn. Затем мы возвращаем экземпляр, из которого получается X, так что вы видите 50.

0 голосов
/ 12 ноября 2009

Простой ответ: «JVM, конечно». К моменту загрузки B JVM уже знает иерархию классов и разрешает все ссылки. Это не похоже на C ++. Конечно, я интерпретирую вас как метафорически использующий термин ВТБЛ. Ни в одной серьезной JRE нет реальной структуры данных, подобной VTBL.

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