2009-08-28 4 views
1

В Java для каждого объекта создается новая копия переменных экземпляра, к которой можно получить доступ, используя ссылку на объект. Но в случае метода экземпляра существует только одна его копия (метод экземпляра). Как к этому методу доступны различные ссылки на объекты?Вызов метода Instance в Java

ответ

3

Байт-код (или собственный код, если он JIT'd) для метода хранится в одном месте. Когда метод вызывается, указатель (под капотом, ака ссылка на более высоком уровне) к экземпляру объекта передается в качестве первого аргумента, поэтому код метода может работать на этом конкретном экземпляре - иметь доступ к его полям и т. Д. В чтобы сэкономить место без дополнительных затрат на производительность, механизм вызова в Java довольно немного сложнее, чем C++, , особенно для методов интерфейса.

2

Методы и поля совершенно разные. Методы применяются ко всем экземплярам объекта, но поля для каждого экземпляра.

Один из способов подумать об этом:
Притвориться, что метод является «глобальным» для всех экземпляров, но он «передал» экземпляр объекта через «эту» ссылку.

Методы могут изменять состояние конкретного экземпляра, но сами они не имеют гражданства.

1

Из предыдущего answer of mine:

Я уверен, что фактическая реализация довольно сильно отличается, но позвольте мне объяснить мое представление о методе отправки, какие модели наблюдаемого поведения точно.

Притворите, что каждый класс имеет хеш-таблицу, которая отображает сигнатуры методов (имя и типы параметров) в фактический фрагмент кода для реализации метода. Когда виртуальная машина пытается вызвать метод в экземпляре, он получает класс объекта и просматривает запрошенную подпись в таблице класса. Если тело метода найдено, оно вызывается, предоставляя исходный объект в качестве ссылки, называемой this.

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

Если у суперкласса и подкласса есть запись в их таблицах для одной и той же сигнатуры метода, сначала встречается версия подкласса, а версия суперкласса никогда не используется — это «переопределение».

+1

Отправка «нормального» интерфейса использует реализацию, близкую к этой. Ключи в хэш-таблице - это реализуемый интерфейс, а значения - метод реализации. Исследования придумали некоторые умные [еще более сложные] способы значительно снизить затраты на отправку интерфейса. Виртуальная диспетчеризация может обрабатываться более эффективно массивом, назначая новый номер слота для каждого метода, который не отменяет базовый метод. Это в основном виртуальная таблица, которая хранится только в дескрипторе типа вместо объекта. –

1

подразумеваемая ссылка «это» передается в каждый метод, который, конечно, можно ссылаться явно

2

За кулисами ссылка на объект передается в метод как часть вызова. Может быть полезно посмотреть на классы отражения Java, в частности Method.invoke().

0

Я предполагаю, что вы имеете значение на упрощенном уровне, как и в том, как вы на самом деле выполняете вызов. Я также предполагаю, что вы отсылая к способу, который имеет модификатор static в своей подписи, то есть:

public static int getNum() 
{ 
    // code in here 
    return num; 
} 

Если это то, что вы имеете в виду, и это было частью класса под названием «SomeClass», то он будет доступен по вызову метода SomeClass.getNum(). т.е. вы ставите фактическое имя класса перед этим методом.

Если это не то, что вы имеете в виду, игнорируйте мой ответ :)

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