java一维数组变量存储的是堆中数组对象的地址而非值;声明时仅创建引用不分配内存,初始化才在堆中分配空间并设默认值或赋具体值,长度固定不可变,访问用.length字段。

Java 一维数组不是“变量存值”,而是“变量存地址”——声明时只建了个空盒子(引用),初始化才真在堆里铺开一排格子,所有操作都得围绕这个本质展开。
声明:只是起个名字,不占空间
写 int[] scores; 或 String[] names;,只告诉编译器“我要用一个叫 scores 的数组变量”,此时它连内存都没申请,更不能访问 scores[0]。这一步不能写长度,int[5] arr; 是语法错误。推荐把方括号放在类型后(int[]),语义清晰,也避免和多维数组混淆。
初始化:三类方式,对应不同场景
初始化 = 分配内存 + 设默认值/赋具体值。跳过这步直接用,运行时会报 NullPointerException。
-
动态初始化:用
new指定长度,元素自动填默认值(int 为 0,String 为 null)int[] ages = new int[4]; -
静态初始化:声明时直接给全元素,长度由编译器数出来
double[] prices = {19.9, 29.5, 9.8}; -
new + 花括号:适合先声明、后一次性赋值,语义等价于静态初始化
char[] chars = new char[]{'a', 'b', 'c'};
变量存储:栈存地址,堆存数据
数组变量(如 scores)本身存在栈里,里面装的不是数字,而是指向堆中那块连续内存的地址。所以:
- 两个变量指向同一数组,改一个,另一个看到的也变
- 数组长度一旦创建就固定,不能像 ArrayList 那样 add() 扩容;要扩容只能新建更大数组,再用
System.arraycopy()或循环拷贝 - 下标从 0 开始,最大合法下标是
length - 1;越界访问抛ArrayIndexOutOfBoundsException
获取长度:用 .length,不是 .length()
arr.length 是数组的公共 final 字段,不是方法,后面不加括号。它反映的是创建时分配的格子数,跟里面有没有赋值无关。比如 int[] a = new int[5];,即使一个元素都没设,a.length 也是 5。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











