Skip to content

8.2 数组的定义与初始化

数组的定义

在 Java 中,数组的定义有两种方式:

方式一:声明数组变量

java
数据类型[] 数组名;

方式二:声明数组变量(C 风格)

java
数据类型 数组名[];

示例:

java
// 声明整型数组
int[] numbers;
// 或
int numbers[];

// 声明字符串数组
String[] names;
// 或
String names[];

数组的初始化

数组的初始化有三种方式:静态初始化、动态初始化和默认初始化。

1. 静态初始化

静态初始化是在声明数组的同时为数组元素赋值。

语法:

java
数据类型[] 数组名 = {元素1, 元素2, 元素3, ...};

示例:

java
// 静态初始化整型数组
int[] numbers = {10, 20, 30, 40, 50};

// 静态初始化字符串数组
String[] names = {"Alice", "Bob", "Charlie", "David"};

// 静态初始化字符数组
char[] characters = {'a', 'b', 'c', 'd'};

// 静态初始化布尔型数组
boolean[] flags = {true, false, true, false};

2. 动态初始化

动态初始化是先声明数组,然后使用 new 关键字创建数组对象并指定长度。

语法:

java
数据类型[] 数组名 = new 数据类型[长度];

示例:

java
// 动态初始化整型数组,长度为 5
int[] numbers = new int[5];

// 动态初始化字符串数组,长度为 3
String[] names = new String[3];

// 动态初始化双精度数组,长度为 10
double[] prices = new double[10];

3. 默认初始化

当使用动态初始化创建数组时,数组元素会被自动赋予默认值。

数据类型默认值
byte, short, int, long0
float, double0.0
char'\u0000'(空字符)
booleanfalse
引用类型null

示例:

java
// 动态初始化整型数组,默认值为 0
int[] numbers = new int[3];
System.out.println(numbers[0]); // 输出 0
System.out.println(numbers[1]); // 输出 0
System.out.println(numbers[2]); // 输出 0

// 动态初始化布尔型数组,默认值为 false
boolean[] flags = new boolean[2];
System.out.println(flags[0]); // 输出 false
System.out.println(flags[1]); // 输出 false

// 动态初始化字符串数组,默认值为 null
String[] names = new String[2];
System.out.println(names[0]); // 输出 null
System.out.println(names[1]); // 输出 null

数组初始化的注意事项

1. 静态初始化的长度

静态初始化时,数组的长度由初始化列表中的元素个数决定,不需要显式指定长度。

java
// 正确:数组长度为 3
int[] numbers = {1, 2, 3};

// 错误:静态初始化时不能指定长度
// int[] numbers = new int[3]{1, 2, 3};

2. 动态初始化的长度

动态初始化时,必须显式指定数组长度,且长度必须是一个非负整数。

java
// 正确:指定长度为 5
int[] numbers = new int[5];

// 错误:没有指定长度
// int[] numbers = new int[];

// 错误:长度为负数
// int[] numbers = new int[-5];

3. 数组变量的赋值

数组变量是引用类型,可以将一个数组变量赋值给另一个数组变量,此时两个变量指向同一个数组对象。

java
int[] a = {1, 2, 3};
int[] b = a; // b 指向 a 所指向的数组

b[0] = 100; // 修改 b[0] 会同时修改 a[0]
System.out.println(a[0]); // 输出 100
System.out.println(b[0]); // 输出 100

示例:数组初始化的使用

示例 1:静态初始化与动态初始化

java
public class ArrayInitializationExample {
    public static void main(String[] args) {
        // 静态初始化
        int[] staticArray = {1, 2, 3, 4, 5};
        System.out.println("Static array:");
        for (int i = 0; i < staticArray.length; i++) {
            System.out.println(staticArray[i]);
        }
        
        // 动态初始化
        int[] dynamicArray = new int[5];
        // 给动态初始化的数组赋值
        for (int i = 0; i < dynamicArray.length; i++) {
            dynamicArray[i] = i + 1;
        }
        System.out.println("\nDynamic array:");
        for (int i = 0; i < dynamicArray.length; i++) {
            System.out.println(dynamicArray[i]);
        }
    }
}

示例 2:默认初始化

java
public class DefaultInitializationExample {
    public static void main(String[] args) {
        // 基本类型数组的默认初始化
        int[] intArray = new int[3];
        double[] doubleArray = new double[3];
        boolean[] booleanArray = new boolean[3];
        char[] charArray = new char[3];
        
        System.out.println("int array default values:");
        for (int i = 0; i < intArray.length; i++) {
            System.out.println(intArray[i]);
        }
        
        System.out.println("\ndouble array default values:");
        for (int i = 0; i < doubleArray.length; i++) {
            System.out.println(doubleArray[i]);
        }
        
        System.out.println("\nboolean array default values:");
        for (int i = 0; i < booleanArray.length; i++) {
            System.out.println(booleanArray[i]);
        }
        
        System.out.println("\nchar array default values:");
        for (int i = 0; i < charArray.length; i++) {
            System.out.println("'" + charArray[i] + "' (ASCII: " + (int) charArray[i] + ")");
        }
        
        // 引用类型数组的默认初始化
        String[] stringArray = new String[3];
        System.out.println("\nString array default values:");
        for (int i = 0; i < stringArray.length; i++) {
            System.out.println(stringArray[i]);
        }
    }
}

示例 3:数组变量的赋值

java
public class ArrayAssignmentExample {
    public static void main(String[] args) {
        int[] a = {1, 2, 3};
        int[] b = a; // b 指向 a 所指向的数组
        
        System.out.println("Before modification:");
        System.out.println("a[0] = " + a[0]); // 输出 1
        System.out.println("b[0] = " + b[0]); // 输出 1
        
        // 修改 b[0]
        b[0] = 100;
        
        System.out.println("\nAfter modification:");
        System.out.println("a[0] = " + a[0]); // 输出 100
        System.out.println("b[0] = " + b[0]); // 输出 100
        
        // 创建一个新的数组并赋值给 b
        b = new int[]{4, 5, 6};
        
        System.out.println("\nAfter creating new array:");
        System.out.println("a[0] = " + a[0]); // 输出 100
        System.out.println("b[0] = " + b[0]); // 输出 4
    }
}

常见问题

1. 数组索引越界

症状:运行时错误:ArrayIndexOutOfBoundsException

解决方案:确保数组索引在有效范围内(0 到 length-1)

2. 空指针异常

症状:运行时错误:NullPointerException

解决方案:确保数组已经初始化,不为 null

3. 初始化方式错误

症状:编译错误,例如:

  • error: array dimension missing
  • error: illegal initializer for int[]

解决方案:正确使用静态初始化和动态初始化的语法

总结

数组的定义和初始化是 Java 中使用数组的基础。数组的定义有两种方式,初始化有三种方式:

  • 静态初始化:在声明数组的同时为数组元素赋值
  • 动态初始化:使用 new 关键字创建数组对象并指定长度
  • 默认初始化:动态初始化时,数组元素会被自动赋予默认值

在使用数组时,需要注意数组索引越界、空指针异常等问题,确保数组的正确使用。

© 2026 编程马·菜鸟教程 版权所有