1.数组初始化

定义数组的方式:

int[] arr1; 或  int arr1[];

数组初始化

通过上边的定义,我们只是得到了一个数组的引用。这时已经为引用分配了存储空间,但是还没有给数组对象本身分配任何空间。想要给数组对象分配存储空间,必须使用初始化表达式。

a.在数组创建的地方进行初始化,如:

int[] arr1 = {1,2,3,4,5};

这种方式等价于使用new来进行存储空间分配。

b.给数组的引用赋值,如:

int[] arr1 = {1,2,3,4,5};

int[] arr2;

arr2 = arr1;

复制的只是一个引用。如下图:

Java 根据一个数组初始化另一个数组 数组 初始化 java_基本类型

所有的数组都有一个固定成员length,通过它可以知道数组元素的个数。

c.当不确定数组元素的个数时的数组创建

当数组元素个数不确定时,我们可以直接使用new在数组里创建元素。注意new可以应用于基本类型的数组,但是不能应用于单个的基本类型。

Java 根据一个数组初始化另一个数组 数组 初始化 java_数组初始化java_02

d.在定义数组的同时也可以进行初始化,当创建一个非基本类型的数组时,实际上创建的是引用数组。

可以用花括号列表的形式来初始化对象数组,有两种形式:

Java 根据一个数组初始化另一个数组 数组 初始化 java_Java 根据一个数组初始化另一个数组_03

2.可变参数列表

下图标出了参数列表的使用方式、格式和对传入参数的要求。

2.1 列表参数类型可以不同的情况

可变参数类型为Object,因为所有的类都直接或间接的继承自Object类,可以向上转型为Object,因此参数列表中的类型可以不一致。

Java 根据一个数组初始化另一个数组 数组 初始化 java_可变参数列表_04

输出如下图:

Java 根据一个数组初始化另一个数组 数组 初始化 java_Java 根据一个数组初始化另一个数组_05

2.2 列表参数类型必须相同的情况

当然可变参数参数列表也可以作为函数的一个参数传入,如下图。这里的参数列表中的参数类型为string,则所有的参数必须是string类型,与上面的程序不同。

Java 根据一个数组初始化另一个数组 数组 初始化 java_Java 根据一个数组初始化另一个数组_06

Java 根据一个数组初始化另一个数组 数组 初始化 java_Java 根据一个数组初始化另一个数组_07

2.3 可变参数列表中的参数可以是任何类型,包括基本类型

下面是可变参数列表为数组的例子:

Java 根据一个数组初始化另一个数组 数组 初始化 java_基本类型_08

Java 根据一个数组初始化另一个数组 数组 初始化 java_数组_09

从输出结果的最后两行可知,可变参数列表实际使用的是基本类型,不依赖自动包装机制。

2.4 可变参数列表和自动包装机制

但是,我们要知道,可变参数列表和自动包装机制可以“共处”,如下图:

Java 根据一个数组初始化另一个数组 数组 初始化 java_基本类型_10

2.5 可变参数列表与函数重载

可变参数列表使重载过程变得复杂:

Java 根据一个数组初始化另一个数组 数组 初始化 java_Java 根据一个数组初始化另一个数组_11

在上面的所有带参数的函数调用,编译器都会使用自动包装机制来匹配重载的方法,然后调用最匹配的方法。但是不使用使用参数来f()时,编译器会二义性错误:

Exception in thread "main" java.lang.Error: Unresolved compilation problem:

The method f(Character[]) is ambiguous for the type OverloadingVarargs

at thingjinjava.OverloadingVarargs.main(OverloadingVarargs.java:25)

那么,如何解决这个问题呢?

可以尝试着在某个方法中增加一个非可变参数来解决该问题。

Java 根据一个数组初始化另一个数组 数组 初始化 java_可变参数列表_12

可是,程序仍然无法通过编译,还是报上面同样的错误。

但是,当我们在给这两个函数都添加一个非可变参数,问题就可以解决了。

Java 根据一个数组初始化另一个数组 数组 初始化 java_Java 根据一个数组初始化另一个数组_13