Why Java Arrays Have No Constructors and How the JVM Instantiates Them
The article explains that Java arrays, unlike regular objects, lack constructors because the JVM creates them directly via special bytecode instructions, automatically zero‑initialising elements and exposing length as a field, which trades flexibility for simplicity and performance.
In Java every object normally has a constructor, but arrays are an exception; they are objects created directly by the JVM.
JVM creates arrays with special bytecode
The compiler translates a new int[3] expression into one of three bytecode instructions: newarray for primitive arrays, anewarray for reference‑type arrays, and multianewarray for multidimensional arrays. A simple experiment—compile a class that creates each kind of array and inspect it with javap —shows these instructions in the generated constructor.
6: newarray int
13: anewarray java/lang/String
23: multianewarray "[[[I", 3When the JVM executes the instruction it allocates a contiguous memory block on the heap and wraps it as an object that inherits from Object. The JVM also zero‑initialises every element (0 for numeric types, false for boolean, null for references), so arrays never contain garbage values.
No constructor, explicit initialization
Because arrays lack a constructor, their elements can only be set after creation. The common ways are an initializer list at declaration, e.g. int[] ports = {80, 443, 8080}; or a loop that assigns each element. There is no syntax to partially initialize an array and leave the rest to defaults.
Zero‑length arrays (e.g., new int[0]) are valid objects, not null. Returning an empty array instead of null avoids the need for callers to perform null checks.
length is a field, not a method
Arrays expose their size through the public final field length. The compiler does not generate a normal field access; it emits the dedicated arraylength bytecode instruction, which the JVM reads directly from the array header without a method call.
Comparison with ordinary objects
Creation: ordinary objects invoke a constructor; arrays are created by a single JVM instruction.
Constructor: always present for objects, absent for arrays.
Element initial values: determined by constructor logic for objects; JVM zero‑initialises arrays.
Size access: objects use a size() method or custom logic; arrays use the length field backed by arraylength.
Conclusion
Arrays are treated by the language as the most basic data container and are given special treatment by the JVM: a single instruction creates them, their memory is contiguous, and elements are automatically zeroed. The trade‑off is reduced flexibility—no constructor, no built‑in resizing, and a minimal API.
Signed-in readers can open the original source through BestHub's protected redirect.
This article has been distilled and summarized from source material, then republished for learning and reference. If you believe it infringes your rights, please contactand we will review it promptly.
samdeepthink
Knowledge Planet: Old Dock's Tech Chronicles Zhihu: SamDeepThinking A technical manager who still codes heavily on the front line. From junior developer to tech lead, then tech manager, now leading the whole front‑ and back‑end development team—leveling up along the way. I have some insights on programming, career development, and tech management.
How this landed with the community
Was this worth your time?
0 Comments
Thoughtful readers leave field notes, pushback, and hard-won operational detail here.
