динамическое выделение памяти java?

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

Также объясните, что происходит, когда вы выполняете ClassA object = new ClassA(); в куче и стеке .


person JavaUser    schedule 28.03.2010    source источник


Ответы (3)


Все объекты Java размещаются динамически. Вы всегда передаете ссылки на них. Так устроен язык. Когда вы делаете:

ClassA obj = new ClassA();

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

person Donal Fellows    schedule 28.03.2010
comment
Почему объект хранится в куче, а ссылка хранится в стеке? - person JavaUser; 28.03.2010
comment
Стек содержит локальные переменные вызова метода. Здесь я предположил, что переменная obj была в вызове метода, поэтому очевидно, что ссылка на объект находится в стеке. Сам объект находится в куче, как и любой другой объект Java во всей программе. Даже классы находятся в куче (хотя компилятор JIT может делать некоторые дополнительные трюки за кулисами). - person Donal Fellows; 28.03.2010

Он динамичен, так как вы не знаете, когда он нуждается в выделении — вы выделяете по требованию.

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

person Brian Agnew    schedule 28.03.2010

Если у вас есть класс JMath и вы хотите получить все его объекты во время выполнения (динамическое выделение), то вы только что написали

ArrayList<JMath> J = new ArrayList<JMath> ();
person Asad Mukhtar    schedule 18.06.2015