顯示的靜態初始化
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配合使用是最好的。