В C, когда мы объявляем что-то, мы сообщаем компилятору, в какой форме содержится эта переменная. Только во время определения мы выделяем для него пространство памяти. Однако в Java пространство памяти выделяется, когда мы объявляем переменную
int x; // allocates space for an int
Правильно ли мое помещение? Означает ли это, что мы должны быть редкими с декаляризацией, насколько это возможно?
Когда дело доходит до переменных в Java, разделение между декларациями и определениями отсутствует. Однако это не влияет на процесс выделения памяти.
Что происходит с распределением памяти в Java, близко к тому, что происходит с распределением памяти из динамической области (т.е. "кучей") в C. Там, определяя переменную типа указателя, выделяет пространство для самой переменной, но она не выделяет память для чего указывает указатель. Вот пример простой обработки строк в C:
// Allocate memory for the pointer
char *str;
// Allocate memory for the string itself
str = malloc(16);
// Copy the data into the string
strcpy(str, "Hello, world!");
Подобные вещи происходят в Java, когда вы имеете дело с объектами. Определение переменной выделяет пространство для ссылки на объект, но не для объекта. Вам нужно вызвать new
, чтобы "прикрепить" эту ссылку к новому объекту:
// Allocate memory for the reference
String str;
// Allocate memory for the string, and sets data
str = new String("Hello, world!");
Обратите внимание, что это относится только к объектам. Примитивные типы обрабатываются по-разному, таким образом, который намного больше похож на то, как примитивы обрабатываются на C.
Объем памяти для примитива будет выделен, когда выделена память для экземпляра объекта. Для статического примитива он выделяется при загрузке класса.
Нет, вы не должны пытаться микро-оптимизировать такие вещи. Это не C, это Java.