2010-10-05 6 views
1

Если каждый объект имеет другую копию переменных экземпляра, где методы «живут»?Где методы «живут»?

В качестве примера:

class A { 
    public foo() { 
     System.out.println("foo"); 
    } 
} 

class B extends A { 
    public foo() { 
     System.out.println("foofoo"); 
    } 
} 

public class Main { 
    public static void main(String[] args) { 
     A a = new B(); 
     a.foo(); // "foofoo" 
    } 
} 

Я знаю, что "foofoo" печатается. Итак, методы, связанные с объектами или что-то еще?

+0

Из-за сходства с вопросом, который я задал на другом языке, я собираюсь связать свой вопрос здесь. Разница между flash и java заключается в том, что flash - это прототип, основанный на языке, который может иметь метод, превосходящий происходящее во время выполнения, поэтому мой вопрос отличается. http://stackoverflow.com/questions/3783256/as2-are-functions-declared-in-a-class-stored-as-separate-instances-taking-up-mor – M2tM

+0

Со времен экономического центра значительная часть методов оставил свои обычные таблицы для чего-то менее гламурного, виртуального vtables –

ответ

3

Это, как правило, проблема с реализацией. Все, что вам нужно заботиться, как программист на Java, состоит в том, что каждый класс может иметь разные методы из других классов.

С точки зрения реализации (если вас интересует поведение под покровом), самым легким решением для каждого класса будет указатель на все соответствующие функции.

Таким образом, когда вы расширяете A с B, экземпляр типа B получит все A «s указатели на методы, но с foo метода указатель, ссылающийся на B» s код.

графическое представление, где B расширяет A, перекрывая только foo:

class A 
    foo ----------> Afoo code 
    bar ----+-----> Abar code 
class B  | 
    bar ----+ 
    foo ----------> Bfoo code 

Экземпляры класса (объекты) знают об их типа, так что вы можете легко получить от объекта b к классу B. Оттуда, это простая операция, чтобы найти правильный код для запуска.

4

Процесс, о котором идет речь, называется динамическая отправка. Образом, что это обычно реализуется через виртуальные таблицы (часто называемые виртуальные таблицы):

http://en.wikipedia.org/wiki/Virtual_table

простое резюме того, как виртуальные таблицы работы в том, что каждый метод хранятся в каком-то адресе памяти и виртуальные таблицы хранит эти адреса , Используя ваш пример, A имеет vtable с записью, в которой хранится адрес памяти его версии foo, тогда как подкласс B имеет свой собственный виртуальный стол с той же компоновкой, но вместо этого он имеет адрес памяти foo.

Смежные вопросы