显示的静态初始化
JAVA语言里面可以允许静态子句块的存在,语法如下所示:
public class S {
static int i;
static {
i = 50;
}
}
这段代码里的第二个static修饰的块,看起来有点像方法,但是不是方法,是静态子句块,也叫静态块,它本质是static修饰的一段代码,初始化方式和其他静态初始化一样的。
还有一种类似于静态块的操作,叫做非静态实例初始化,实例初始化子句的语法结构如下:
{
m1 = new M(1);
m2 = new M(2);
}
这个初始化操作是在构造器之前执行的。
数组初始化
数组本质上是一个相同类型,然后使用同一个标识符标识到一块的对象或者基本类型数据序列。java中数组通常这样表示:int [] a;这个代表一个int型的数组,这个也是对数组的一个引用。
初始化数组可以在类的任何地方进行,但是通常初始化是通过大括号来进行的,比如:
int[] a = {1,2,3,4,5};
java语言中,可以将数组赋值给其他数组,本质上是复制了一个引用而已,比如:
int a1 = {1,2,3,4,5};
int[] a2;
a2 = a1;
上面代码中,a2和a1指向同一个数组,也就是说,通过其中一个引用修改数组,会在每一个引用中看到。
数组都有一个length,它就是数组长度,数组的下标都是从0开始,最大为length-1。对于数组的大小,如果不确定,可以通过new来定义大小。比如:
int[] a;
a = new int[20];
这个代码定义了长度为20的int型数组。数组如果是基本类型,可以自动进行初始化,结果对于基本类型的默认值,数组和字符都是0,布尔类型就是false。当然,数组可以在定义的时候,直接进行初始化。
如果你需要打印一个数组,就用Arrays.toString(数组)方法进行。
初始化对象数组可以使用两种方式,一种的示例如下:
Integer[] a ={
new Integer(1),
new Integer(2),
3,
}
另一种的示例如下:
Integer[] b = new Integer[]{
new Integer(1),
new Integer(2),
3,
}
初始化列表中最后一个逗号可以有,也可以没有。
第一种的形式很简洁,但是有局限性,只能在定义数组的地方使用,其他地方不可以使用,但是第二种就很灵活了,可以在定义的时候使用,也可以当做一个参数传到方法里面。示例如下:
对象.方法(new String[]{“a”,”b”})
这种方式可以传入可变参数列表。
可变参数列表
可变参数列表的定义示例如下:
public class Test {
static void f(int r, String… t) {
for(String s : t){
System.out.print(s);
}
}
public static void main(String[] args) {
f(1,”one”);
f(2,”two”,”three”);
f(0);
}
/*Output:
1 one
2 two three
0
}
这个示例中的类型是String,实际当中参数可以是任何类型的。
可变参数列表中,基本类型可以和自动包装类共存,自动包装机制会把基本类型,提升为包装类。
可变参数列表还可以和重载机制配合使用,同样的方法名称,但是可变参数列表类型不一样,依然可以共存。但是如果一个类里面有两个以上同名的可变参数列表,如果调用方法时,不传入参数,就会报错了,因为编译器不知道应该调用哪个方法,解决这个问题其实很简单,就是我们在参数列表里面,添加一个非可变参数,从而区分重载方法。
枚举类型
在JAVA语言中,枚举类型会经常被使用,枚举语法的示例如下:
public class Test {
AA, BB, CC
}
枚举类型实例是常量,所以命名都是大写,多个单词用下划线分开。
使用的话,语法格式如下:
Test t = Test.AA;
enum有一些特性和方法,比如ordinal()方法用来表示enum常量的声明顺序,static values()方法用来产生按照常量声明顺序构成的数组。
示例如下:
public class EnumOrder {
public static void main(String[] args) {
for(Test t : Test.values()){
System.out.println(t + “ ordinal ” + t.ordinal());
}
}
}
/*Output:
AA, ordinal 0
BB, ordinal 1
CC, ordinal 2
我们之前学过,switch语句是有限集合进行选择,它和enum配合使用是最好的。