在Java中,字段的初始化方式有三種:
- 就地初始化
- 使用構造方法初始化
- 使用代碼塊初始化
前兩種方式非常簡單,接下來介紹一下工程中常用的第三種方式:使用代碼塊初始化。
什麼是代碼塊?
使用{}
定義的一段代碼.
根據代碼塊定義的位置以及關鍵字,又可分爲以下四種:
- 普通代碼塊
- 構造塊
- 靜態塊
- 同步代碼塊(涉及多線程知識後面再講解)
普通代碼塊
普通代碼塊:定義在方法中的代碼塊。
public class Main{
public static void main(String[] args) {
{ //普通方法塊
int x = 10 ;
System.out.println("x1 = " +x);
}
int x = 100 ;
System.out.println("x2 = " +x);
}
}
// 執行結果
x1 = 10
x2 = 100
構造代碼塊
定義:定義在類中的代碼塊(不加修飾符)。也叫:實例代碼塊、構造塊。
構造代碼塊一般用於初始化實例成員變量,類似於C++中的初始化成員列表。
class Person{
private String name; //實例成員變量
private int age;
private String sex;
public Person() {
System.out.println("I am Person init()!");
}
{ //實例代碼塊
this.name = "giturtle";
this.age = 21;
this.sex = "man";
System.out.println("I am instance init()!");
}
public void show(){
System.out.println("name: "+name
+" age: "+age
+" sex: "+sex
);
}
}
public class Main {
public static void main(String[] args) {
Person p1 = new Person();
p1.show();
}
}
// 運行結果
I am instance init()!
I am Person init()!
name: giturtle age: 21 sex: man
從執行結果可以看到:實例代碼塊優先於構造函數執行。
靜態代碼塊
定義:使用static
定義的代碼塊。一般用於初始化靜態成員屬性。
class Person{
private String name; //實例成員變量
private int age;
private String sex;
private static int count = 0; //靜態成員變量 由類共享數據、方法區
public Person(){
System.out.println("I am Person init()!");
}
{ //實例代碼塊
this.name = "giturtle";
this.age = 21;
this.sex = "man";
System.out.println("I am instance init()!");
}
static { //靜態代碼塊
count = 10; //只能訪問靜態數據成員
System.out.println("I am static init()!");
}
}
public class Main {
public static void main(String[] args) {
Person p1 = new Person();
Person p2 = new Person(); //靜態代碼塊不會執行
//只會在最開始執行一次
}
}
// 運行結果
I am static init()!
I am instance init()!
I am Person init()!
I am instance init()!
I am Person init()!
注:
- 靜態代碼塊不管生成多少個對象,其只會執行一次,且是最先執行的。
- 靜態代碼塊執行完畢後, 實例代碼塊(構造塊)執行,再然後是構造函數執行。