#java #static #static-methods #static-members
#java #статический #статические методы #статические члены
Вопрос:
У нас есть две классификации heap и stack . При создании объекта память для объекта сохраняется в куче. Что делать, если в классе есть статические методы, которые можно вызвать, используя имя класса. Если объект не создан, то как он будет выделять память, и если да, то где он будет выделять память?
Комментарии:
1. И для чего предназначена эта выделенная память?
2. Из его комментария ниже ясно, что это Java, поэтому я добавил тег Java.
Ответ №1:
Это зависит от JVM, но статические поля обычно хранятся в специальном объекте в куче. (Вы можете увидеть это в дампе кучи) Когда загрузчик классов выгружается, его классы и их статические «объекты» / поля также очищаются.
Единственное отличие статического «объекта» в том, что вы не можете получить ссылку на него. (Но вы можете использовать отражение для доступа к полям)
Ответ №2:
Методы (т. Е. Код) Не хранятся в объекте; все объекты класса будут совместно использовать код для метода. Независимо от языка (Java, C или практически любого другого) для любого метода, статического или нет, будет существовать только одна копия кода. Обычно существует определенная область памяти, то есть сегмент КОДА на родном языке, таком как C , или специальная область кучи в Java, куда загружается код.
Комментарии:
1. Хорошо, память для объектов создается вместе с классом. т.е. в куче (java) создается только память для класса, только когда мы используем оператор new, мы можем создать память. Но для таких классов, как Math, мы не можем создавать экземпляры .. в таком случае, где создается память?
2. Как я уже сказал (но я не уверен, что вы поняли), код не хранится в объектах, так что это вообще не проблема. На самом деле он не хранится нигде, где вы можете к нему добраться. Он хранится в другом месте в специальной части кучи. JVM загружает байт-код из файла класса, преобразует его некоторым способом, зависящим от реализации, и делает методы доступными для вашей программы.
3. @user980918 java.lang. Математике не требуется много памяти во время выполнения — единственная часть, о которой я могу думать, — это статическая переменная, которая содержит
Random
объект. Статические переменные для класса хранятся в куче вместе сClass
объектом. (Локальные переменные в методах находятся в стеке, независимо от статичности метода.)
Ответ №3:
-
Пространство постоянной генерации (PermGen) кучи содержит постоянные метаданные класса и информацию о дескрипторах.
-
Постоянное пространство всегда зарезервировано для классов и тех, которые привязаны к классам (статические члены, статические функции и т. Д.)
-
Статическая функция принадлежит классу, поэтому ее можно вызывать без создания объекта класса.