Какие операции происходят, когда мы передаем аргумент методу? - PullRequest
0 голосов
/ 27 августа 2009

Я знаю, что если я пройду:

  • тип примитива, тогда копия элемента будет отправлена ​​
  • тип объекта, затем будет отправлена ​​копия ссылки

Я предполагаю, что (пожалуйста, подтвердите):

  • Размер ссылки равен размеру элемента объекта
  • Размер объекта - это сумма всех размеров примитивного и ссылочного типов, которые он содержит
  • Статические переменные не содержатся в объекте
  • если тип примитива отличается, то результирующий тип всегда как минимум самый широкий из двух типов.

Я не уверен, что произойдет, если я пройду:

  • 'null' (пустая ссылка?)
  • тип объекта отличается (первый общий родительский элемент?) (Как это найти ???)
  • enum (копия int?)
  • анонимный класс

Ответы [ 3 ]

5 голосов
/ 27 августа 2009

Если вы говорите о вызовах методов в памяти (а не RMI или что-то в этом роде), размер всех ссылок одинаков. Они являются ручкой для объекта в куче. Неважно, какого размера объект.

Предполагая, что вы можете скомпилировать код, тип примитива каким-то образом будет соответствовать вызывающему методу. Либо явным приведением, либо автоматическим расширением, в зависимости от того, что вы делаете (вызываете ли вы длинный метод с помощью int или метод int с длинным).

Ссылка всегда одна и та же, независимо от того, является ли она перечислением, приведенным к другому типу объекта (объект тот же, только ссылка на тип, отличается) или анонимного класса. Во всех случаях это ссылка на экземпляр объекта в куче.

Анонимный класс (или любой внутренний класс, не объявленный как статический) имеет неявную скрытую ссылку на своего родителя.

Ноль не представляет ссылку, так что я не знаю о размере, но JVM будет иметь некоторое внутреннее представление об этом. Я сомневаюсь, что на практике это меньше, чем ссылка на объект, с точки зрения объема памяти, но это может быть, особенно в JavaME.

Следует отметить, что на практике Java-разработчики мало думают об этих вещах. Об этом заботятся только те, кто внедряет JVM (например, размер ссылок). Вы не можете ничего с ними сделать на этом языке, поэтому, если у вас из-за этого проблемы с производительностью, выберите другой язык.

1 голос
/ 27 августа 2009

Почему бы вам не проверить Google?

http://www.yoda.arachsys.com/java/passing.html

Также - в Java нет sizeof.

0 голосов
/ 27 августа 2009

Я не уверен, что вы ищете с точками "Базовый размер", но вот несколько, которые я могу ответить с некоторой уверенностью:

если тип примитива отличается, то результирующий тип всегда как минимум самый широкий из двух типов.

не совсем верно. Если вы укажете int и передадите long, вы должны понизить его до int, и будет передано int. Если вы передадите байт, он будет автоматически преобразован в int. Он всегда будет передавать int.

Размер объекта - это сумма всех примитивов и размеров ссылочных типов, которые он содержит

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

Статические переменные не содержатся в объекте

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

'null' (пустая ссылка?)

Если вы передадите значение null, оно будет действовать почти так же, как c (я думаю, что указатель на 0 или какое-то другое предопределенное неверное расположение означает «Null»), но у вас нет доступа к нему, кроме как сравнить его с null или NPE, вы не можете иметь дело с этим другими способами, как вы можете в C

тип объекта отличается (первый общий родительский элемент?) (Как это найти ???)

В объекте хранятся метаданные, которые сообщают вам, какой это тип, но, что более важно, есть таблица указателей, так что вызываемый метод "Правильно" всегда является обращением к указателю. вам не нужно выяснять, какой класс у вас есть на самом деле, и сканировать дерево «Extends», чтобы найти первую реализацию данного метода, вместо этого, независимо от того, к чему приведен ваш класс, есть указатель на правильный метод «toString», который Вы должны использовать.

анонимный класс

Это магические имена, основанные на имени класса родителя и скомпилированные как обычные классы с некоторыми специальными исключениями.

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