首页 > 代码库 > Chapter5_初始化与清理_数组初始化与可变参数列表

Chapter5_初始化与清理_数组初始化与可变参数列表

一、数组初始化

  数组是相同类型的,用一个标识符名称封装到一起的一个对象序列或基本类型数据序列。编译器是不允许指定数组的长度的,当使用语句int[] a时,拥有的只是一个符号名,即一个数组的引用,并不拥有这个数组的存储空间。要获取数组的存储空间,必须要写初始化表达式,最朴素的表达式类型如下

 1 int[] a = {1,2,3}; 

  如果在编写程序时,不能确定数组的长度,可以使用如下方式,直接用new在数组里创建元素

 1 int[] a = new int[3]; 

  当创建对象数组时,数组中的元素仅仅是对象的引用,当试图使用数组中的空引用时,会引起编译器运行期错误,这是需要注意的,可以使用用花括号括起来的列表初始化对象数组。

1 Integer[]  = {
2     new Integer(1),
3     new Integer(2),
4     3,        
5 }

  数组类型还有两个使用很多的方法,一个是length()方法,用来返回数组的长度,一个是.toString()方法,会将数组以可视化的方法打印出来。

 

二、可变参数列表

  先举一个可变参数的例子。

 1 class A{
 2     
 3 }
 4 
 5 public class test{
 6     static void print(Object... args){
 7         for(Object obj:args){
 8             System.out.print(obj + " ");
 9         }
10         System.out.println();
11     }
12     public static void main(String args[]){
13         print(new Integer(1), new Float(2.0), new Double(3.0));
14         print("a", "b", "c");
15         print(new A(), new A(), new A());
16     }
17     
18 }

 1 1 2.0 3.0 2 a b c 3 test1.A@15db9742 test1.A@6d06d69c test1.A@7852e922 

  这种方法的效果是可变参数列表和自动包装机制的和谐共处,使用了可变参数列表,当指定参数类型后,编译器会给你自动填充数组,即允许将一组事物当做列表传递给一个数组,并且将空参数列表传递给可变参数列表是可行的。除了object类型的参数列表,参数列表可以使用任何类型的参数,包括基本类型。

  使用可变参数列表,会使重载过程变得更加复杂,需要注意这种复杂带来的问题,以下是一个例子。

 1 public class test{
 2     static void f(Character... args){
 3         System.out.print("first");
 4         for(Character c:args){
 5             System.out.print(c + " ");
 6         }
 7         System.out.println();
 8     }
 9     
10     static void f(Integer... args){
11         System.out.print("first");
12         for(Integer c:args){
13             System.out.print(c + " ");
14         }
15         System.out.println();
16     }
17     
18     static void f(Long... args){
19         System.out.print("third");
20     }
21     
22     public static void main(String args[]){
23         f(‘a‘, ‘b‘, ‘c‘);
24         f(1);
25         f(2, 1);
26         f(0);
27         f(0l);
28         //f();
29     }
30     
31 }

  在这种情况下,不能调用f()方法,因为编译器会不知道该调用哪个方法了,这是可变参数列表带来的潜在的隐患。为了解决这种隐患,可以给每个参数列表都添加一个非可变参数,例如:

 1 static void f(Integer i,Integer... args); 2 static void f(float i, float... args); 

Chapter5_初始化与清理_数组初始化与可变参数列表