В Java для каждого объекта создается новая копия переменных экземпляра, к которой можно получить доступ, используя ссылку на объект. Но в случае метода экземпляра существует только одна его копия (метод экземпляра). Как к этому методу доступны различные ссылки на объекты?Вызов метода Instance в Java
ответ
Байт-код (или собственный код, если он JIT'd) для метода хранится в одном месте. Когда метод вызывается, указатель (под капотом, ака ссылка на более высоком уровне) к экземпляру объекта передается в качестве первого аргумента, поэтому код метода может работать на этом конкретном экземпляре - иметь доступ к его полям и т. Д. В чтобы сэкономить место без дополнительных затрат на производительность, механизм вызова в Java довольно немного сложнее, чем C++, , особенно для методов интерфейса.
Методы и поля совершенно разные. Методы применяются ко всем экземплярам объекта, но поля для каждого экземпляра.
Один из способов подумать об этом:
Притвориться, что метод является «глобальным» для всех экземпляров, но он «передал» экземпляр объекта через «эту» ссылку.
Методы могут изменять состояние конкретного экземпляра, но сами они не имеют гражданства.
Из предыдущего answer of mine:
Я уверен, что фактическая реализация довольно сильно отличается, но позвольте мне объяснить мое представление о методе отправки, какие модели наблюдаемого поведения точно.
Притворите, что каждый класс имеет хеш-таблицу, которая отображает сигнатуры методов (имя и типы параметров) в фактический фрагмент кода для реализации метода. Когда виртуальная машина пытается вызвать метод в экземпляре, он получает класс объекта и просматривает запрошенную подпись в таблице класса. Если тело метода найдено, оно вызывается, предоставляя исходный объект в качестве ссылки, называемой this
.
В противном случае получается родительский класс класса, и поиск повторяется там. Это продолжается до тех пор, пока не будет найден метод, или нет родительских классов, что приводит к NoSuchMethodError
.
Если у суперкласса и подкласса есть запись в их таблицах для одной и той же сигнатуры метода, сначала встречается версия подкласса, а версия суперкласса никогда не используется — это «переопределение».
подразумеваемая ссылка «это» передается в каждый метод, который, конечно, можно ссылаться явно
За кулисами ссылка на объект передается в метод как часть вызова. Может быть полезно посмотреть на классы отражения Java, в частности Method.invoke().
Я предполагаю, что вы имеете значение на упрощенном уровне, как и в том, как вы на самом деле выполняете вызов. Я также предполагаю, что вы отсылая к способу, который имеет модификатор static
в своей подписи, то есть:
public static int getNum()
{
// code in here
return num;
}
Если это то, что вы имеете в виду, и это было частью класса под названием «SomeClass
», то он будет доступен по вызову метода SomeClass.getNum()
. т.е. вы ставите фактическое имя класса перед этим методом.
Если это не то, что вы имеете в виду, игнорируйте мой ответ :)
- 1. вызов метода Java Java
- 2. Java явный вызов конструктора и Instance Initializer
- 3. вызов метода Java AJAX
- 4. LuaJ - Вызов метода Java
- 5. Java Android: вызов метода
- 6. Java асинхронный вызов метода
- 7. Java вызов метода заказа
- 8. Вызов главного метода Java
- 9. Java виртуальный вызов метода
- 10. Java. Вызов метода подкласса
- 11. Java Вызов метода
- 12. Вызов метода делегата в Java
- 13. java - вызов метода в подклассе
- 14. Вызов метода Java в JSP
- 15. Вызов метода захвата в Java
- 16. вызов метода main в java
- 17. Вызов метода Java в HTML
- 18. Вызов java-метода в jsp
- 19. Вызов метода в классе Java
- 20. Вызов метода экземпляра в Java
- 21. Вызов супер метода в Java
- 22. Перегрузка и вызов метода Java
- 23. Вызов метода из другого метода (java)
- 24. Рекурсивный вызов с Generic метода в Java
- 25. Наследование и вызов метода (экземпляр vs non-instance)
- 26. Вызов метода java в Mysql query-java
- 27. INSTANCE в Java Enum
- 28. Вызов метода с использованием отражения в Java
- 29. Вызов метода в Java с помощью отражения
- 30. Вызов метода JSNI из метода Java
Отправка «нормального» интерфейса использует реализацию, близкую к этой. Ключи в хэш-таблице - это реализуемый интерфейс, а значения - метод реализации. Исследования придумали некоторые умные [еще более сложные] способы значительно снизить затраты на отправку интерфейса. Виртуальная диспетчеризация может обрабатываться более эффективно массивом, назначая новый номер слота для каждого метода, который не отменяет базовый метод. Это в основном виртуальная таблица, которая хранится только в дескрипторе типа вместо объекта. –