2016-01-25 3 views
0

Предположим, у меня есть фрагмент кода, как это: -выделение памяти переменной в java?

class A { 
    void help() { 
     Help helper = new Help(); 
    } 
} 

в вышеупомянутом случае, ссылка на объект помощника будет выделена память в стеке.

теперь, если у меня есть случай, как этот

class A { 
    Help helper = new Help(); 
} 

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

+4

Возможный дубликат [Где указано ссылочное значение переменной, в стеке или в куче?] (Http://stackoverflow.com/questions/873792/where-is-allocated-variable-reference-in-stack-or- в-куче) –

ответ

0

Этот тип объявления находится только в вашем экземпляре. атрибут помощника будет назначен каждый раз, когда вы инициируете вас. Класс A.

Это определенно переменная экземпляра. он идет в кучу

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

0

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

0

Существует разница между объектной и ссылочной переменной. например:

//Here helper is the reference variable 
Helper helper = new Helper(); 

Всякий раз, когда мы создаем какой-либо объект (new Helper()), он всегда создается в кучного пространстве и это ссылка (helper) в Stack пространстве.

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

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

enter image description here

0

Да, во втором случае память будет выделена на объект helper как только объект class A будет инициализирован но в первом случае память будет выделяться в стеке к функция с именем void help() и будет уничтожена, как только функция закончится, потому что объект helper - это локальная переменная.