So in a language like C, memory is separated into 5 different parts: OS Kernel, text segment, static memory, dynamic memory, and the stack. Something like this:
You are creating a new array, not modifying the old one. The new array will get its own space and the old one will be garbage-collected (so long as nobody else holds a reference to it).
The value of a
is just a reference to an object. The array creation expression (new int[2]
) creates a new object of the right size, and assigns a reference to a
.
Note that static
in Java is fairly separate to static
in C. In Java it just means "related to the type rather than to any particular instance of the type".
In Java you've merely asked that a strongly typed reference to an array be stored statically for the class Test
. You can change what a
refers to at runtime, which includes changing the size. This would be the C equivalent of a static storage of an int*
.
I assume when you're referring to "static memory" you're referring to the heap. In Java, the heap serves a similar purpose to the "static data segment" you mentioned. The heap is where most objects are allocated, including arrays. The stack, on the other hand, is where objects that are used only during the life of a single method are placed.
In java any time you use the word new
, memory for that object is allocated on the heap and a reference is returned. This is also true for arrays. The int[] a
is just the reference to new int[1]
. When you do new int[2]
, a new array is allocated and pointed to a. The old array will be garbage collected when needed.
In Java, a static
variable exists as part of the class object. Think of it as an instance variable for the class itself. In your example, a
is a reference variable, which refers to some array (or no array at all, if it is null
), but the array itself is allocated as all arrays are in Java: off the heap.