5.8数组初始化
数组是相同类型的、用一个标识符名称封装到一起的一个对象序列或者基本数据类型序列。数组通过方括号下标操作符来操作和使用。
//定义数组的两种方法,一般是用第一种 int[] a1; int a2[];
编译器不允许指定数组的大小,因为现在指定的只是数组的一个引用,并且还没有为数组对象本身分配任何空间。为了给数组创建相应的存储空间,必须通过初始化表达式。数组的初始化动作可以出现在代码的任何地方,当然也可以在定义之后就立刻使用花括号初始化,这种方式下,存储空间的分配将由编译器负责(等价于new)。
需要注意的是,这里定义的只是数组的引用,若是直接将一个数组赋值给另外一个,那么实际上也是只赋值了引用,这和之前提到的别名是一致的。
C和C++可以允许使用数组时越界,但是Java会直接出现运行时错误。
就像之前提到的,数组定义之后也应该在使用之前初始化,若暂时不知道数组中会出现多少元素,可以使用随机数来决定。
5.8.1可变参数列表:
Java的所有类都直接或简介继承于Object类,应用这一特性,可以解决暂时不知道参数个数和类型的方法创建问题。
public class VarArgs { static void printArray(Object[] args){ for (Object obj : args) System.out.println(obj+" "); System.out.println(); } public static void main(String[] args){ printArray(new Object[]{new Integer(47),new Float(0.23),new Double(3.145)}); printArray(new Object[]{"one","two","three"}); printArray(new Object[]{new A(),new A(),new A()}); } } class A{} // 47 // 0.23 // 3.145 // // one // two // three // // A@1b6d3586 // A@4554617c // A@74a14482
上例就是使用Object类型的数组参数实现可变参数列表,应对各种类型,任意长度的参数列表,但是Java SE5提供了更加简便的编写方法:
public class NewVarArgs { static void printArray(Object... args){ for(Object obj : args) System.out.println(obj + " "); System.out.println(); } public static void main(String[] args){ //直接接受参数,不用外套数组 printArray(new Integer(47),new Float(1.23),new Double(3.1415)); printArray("one","two","three"); printArray(new B(),new B(),new B()); //也可以接受数组参数 printArray((Object[])new Integer[]{1,2,3,4});//这里涉及到了显式类型转换 printArray();//空参数也没问题 } } class B{} // 47 // 1.23 // 3.1415 // // one // two // three // // B@1b6d3586 // B@4554617c // B@74a14482 // // 1 // 2 // 3 // 4
有了这种三个点的写法,我们就再也不用手写一个Object数组了,实际上这个工作是编译器代替我们完成了,从内部的foreach语法可以看出,方法接收到的还是一个数组类型。
public class OptionalTrailingArguments { static void f(int required, String... trailing){ System.out.println("required:" + required); for(String str : trailing){ System.out.println(str + " "); } System.out.println(); } public static void main(String[] args){ f(1,"one"); f(2,"one","two"); f(0); } } // required:1 // one // // required:2 // one // two // // required:0
这个例子说明了可变参数列表也可以接受指定类型的参数,也可以在内部加上一个参数个数判定,看是否和接受的参数个数相等。同时,也可以使用args.getClass()这样的语句进行更严格的类型检查。
5.9枚举类型
enum关键字是Java SE5新添加的特性,他使得我们在需要群组并使用枚举类型集时可以很方便的处理。在此之前,你需要创建一个整型常量集,但是这些枚举值并不会必然地将其自身的取值限制在这个整型常量集范围之内,这就有了越界风险。
public enum Spiciness{ NOT,MILD,MEDIUM,HOT,FLAMING }
上面的例子创建了名为Spiciness的枚举类型,有五个具名值,命名惯例,枚举类型全部大写字母,下划线隔开多个单词。
public static void main(String[] args){ Spiciness howHot = Spiciness.FLAMING; System.out.println(howHot); } //output: //FLAMING
上例是枚举类型的使用方法,使用enum之前需要创建一个该类型的引用,并将其赋值给某个实例。
enum另外一个比较实用的特性是可以用于switch语句中。
2.17上传 第五章读完
P142