Java数组声明时不指定长度,仅定义引用变量;长度只能在初始化时通过new或大括号确定,且创建后不可变。

Java 中数组声明时是否指定长度,本质区别在于:声明语句本身不分配内存,而初始化(创建数组对象)才决定长度;所谓“声明时指定长度”,其实是声明与初始化合并写法的常见误解。
声明阶段:长度信息完全不出现
纯声明(不创建数组对象)时,无论哪种写法,都不允许、也不能指定长度:
-
错误写法:
int[5] arr;或int arr[5];—— 编译报错,Java 不支持在声明中写长度 -
合法声明:
int[] arr;或int arr[];—— 二者等价,都只是定义一个数组引用变量,此时arr == null
初始化阶段:长度由 new 或大括号确定
真正指定长度,发生在用 new 创建数组或使用数组字面量时:
-
int[] arr = new int[5];—— 明确创建长度为 5 的 int 数组,元素默认为 0 -
int[] arr = {1, 2, 3};—— 字面量初始化,长度由元素个数推断为 3 -
int[] arr; arr = new int[10];—— 声明和初始化分离,长度在运行时通过new指定
常见混淆点:方括号位置 ≠ 长度声明
int[] arr 和 int arr[] 只是语法风格差异(前者推荐),方括号永远属于类型,不是长度标记:
立即学习“Java免费学习笔记(深入)”;
-
int[] arr;表示 “arr 是一个 int[] 类型的引用” -
int arr[];同样表示 “arr 是一个 int[] 类型的引用”,C 风格写法,不推荐但合法 - 写成
int[5] arr会被当作“5 是类型一部分”,Java 类型系统中不存在这种类型,直接编译失败
动态长度只能靠 new 或集合替代
Java 数组长度一旦创建就不可变。若需运行时决定长度,必须用 new 并传入表达式:
-
int n = scanner.nextInt(); int[] arr = new int[n];—— 合法,n 在运行时计算 - 不能写
int[] arr = new int[scanner.nextInt()];?其实可以——只要表达式返回 int,就合法 - 真正无法做到的是:声明时写死长度(如 C 的
int arr[5];),Java 没有这种语法









