2013-05-13 3 views
1

У меня простой запрос. В принципе, это теоретический вопрос. Мне нужно очистить эту идею. Я не нашел подходящего ответа на него. Вопрос очень прост. Предположим, что у нас есть класс с именем как аИспользование управления памятью в java

class A{ 
    ...... 
} 

Теперь от моей основной функции я создаю один объект А.

A obj = new A(); 

теперь после создания объекта я будет иметь возможность доступа к любым методам, переменные, присутствующие в классе.

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

A.methodname(); 

теперь мой вопрос, если мы создаем один объект любого класса, то память будет выделена this.Now если мы используем статические методы, напрямую вызывающие их через имя класса, тогда мы не создаем никаких объектов, поэтому в этом случае память не должна выделяться. Но без выделения памяти, как мы получаем доступ к методам или любому имени переменной? некоторые выделения памяти. Пожалуйста, объясните, как в этом случае происходит распределение памяти или как мы получаем доступ к методам или переменным в классе.

+0

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

ответ

2

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

Собственно, вы делаете. Это зависит от JVM, но JVM HotSpot создает специальный объект для всех статических полей. Вы можете увидеть этот объект в куче кучи.

Создание этого объекта облегчает для GC отслеживание того, какие объекты используются. Этот объект класса отбрасывается, когда ClassLoader выгружается.

+1

Спасибо за ответ. Я очистил свои сомнения. Я не знал этого: «Это зависит от JVM, но JVM HotSpot создает специальный объект для всех статических полей. Этот объект можно увидеть в куче кучи». lot Peter.Its бесценная информация для меня – Chiradeep

+0

может у вас немного информации о том, что такое Hotspot JVM? – Chiradeep

+0

Лучшая вики для внутренних компонентов HotSpot находится здесь https://wiki.openjdk.java.net/display/HotSpot/Runtime –

1

Это делается путем загрузки классов.

У нас нет какого-либо экземпляра объекта, но у нас есть код класса загружен в память, так что на самом деле есть распределение памяти.

1

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

1

Статические элементы (методы и переменные) выделяются JVM при загрузке класса.

без выделения памяти, как мы получаем доступ к методам или любому имени переменной?

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

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

0

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

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

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

Cheers!

0

Для статичности во время загрузки класса распределение памяти выполняется в постоянном поколении. Инициализация происходит только один раз. Это связано с классом not object.

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