2010-03-21 10 views
1

Что подразумевается под стратегией решения виртуальной таблицы, используемой JVM? Может кто-нибудь объяснить подробно?Java-интерфейсы

ответ

5

В принципе любой метод, который не объявлен final, может быть переопределен в любом классе наследования. Стратегия разрешения виртуальных таблиц заключается в том, как Java динамически отправляет вызовы метода методу определения типа среды выполнения объекта. Например, если у вас есть объект s, который объявлен как тип Shape, но был создан как new Circle() (то есть Shape s = new Circle()), а затем вы вызываете s.draw() ... если Circle переопределяет draw, вы хотите, чтобы версия Circle's метода draw вызывается, а не версия этого метода Shape. Эта информация может быть выяснена только во время выполнения (если вам передан объект Shape, он может быть передан из JAR, который компилятор никогда не видит, поэтому компилятор не имеет возможности выяснить, какой конкретный подкласс Shape был создан), и поэтому виртуальная машина должна отправить вызов метода в правильное определение метода (в данном случае - версию draw, предоставленную Circle).

 
// Shape.java 
public class Shape 
{ 
    public void draw(){ 
     System.out.println("I'm a Shape"); 
    } 
} 


// Circle.java 
public class Circle extends Shape 
{ 
    public void draw(){ 
      System.out.println("I'm a Circle"); 
    } 
} 

// Elsewhere 
Shape s = new Circle(); 
s.draw(); // should print "I'm a Circle" 

В большинстве реализаций виртуальной таблицы, каждый класс имеет таблицу, где каждая запись является функцией элемента и его соответствующий адрес. Таким образом, виртуальная таблица для Circle и Shape будет иметь запись в таблице для «draw», но для виртуальной таблицы для Circle и Shape каждая запись для точки рисования соответствует их соответствующим определениям этой функции. Затем каждый экземпляр класса указывает на виртуальную таблицу данного класса. Итак, когда вы делаете new Circle(), в нем есть запись, указывающая на виртуальную таблицу Circle. Когда вызывается метод, который не объявлен final, соответствующие реализации метода вызывается путем поиска соответствующего смещения в виртуальной таблице объекта.