根據程式碼塊出現的位置不同,可以分為三類:
區域性程式碼塊:寫在方法裡面。作用一般是提前結束變數的生命週期。
構造程式碼塊:寫在方法外面,類裡面,即寫在成員位置。
靜態程式碼塊:加上 static 進行修飾。
區域性程式碼塊
區域性程式碼塊寫在方法裡面。作用一般是提前結束變數的生命週期。
這個功能最本質的作用就是節約記憶體,變數用不到了就立馬讓它消失。因為現在電腦已經不缺這點記憶體了,這個功能現在已經幾乎用不上了。
構造程式碼塊
構造程式碼塊寫在方法外面,類裡面,即寫在成員位置。
作用是把多個構造方法中重複的程式碼提取出來。執行時機為:在建立本類物件時,先執行構造程式碼塊,再執行構造方法。這個技術現在也漸漸地被淘汰了,就是因為這種寫法不夠靈活。
構造程式碼塊使用案例:
下面的 Javabean 類中,兩個構造方法中有相同的語句,比較繁瑣,可以提取出來形成構造程式碼塊。
修改之前的程式碼:
public class Student {
String name;
int age;
public Student() {
System.out.println("開始建立物件了。");
System.out.println("空參構造");
}
public Student(String name, int age) {
System.out.println("開始建立物件了。");
System.out.println("有參構造");
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
修改之後的程式碼:
public class Student {
String name;
int age;
{
System.out.println("開始建立物件了。");
}
public Student() {
System.out.println("空參構造");
}
public Student(String name, int age) {
System.out.println("有參構造");
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
測試類:
public class Test {
public static void main(String[] args) {
Student s = new Student();
}
}
執行結果:
開始建立物件了。
空參構造
雖然測試類沒有呼叫列印語句,但是執行測試類,還是會輸出內容。根據輸出內容也能看出來構造程式碼塊是在構造方法之前執行的,先執行構造程式碼塊再執行構造方法。
這個技術不夠靈活,例如,我現在有一個帶部分引數的構造方法,且執行這個構造方法時,我不想執行構造程式碼塊,那麼是無法做到的,因為構造程式碼塊一定會執行且一定在構造方法執行之前執行。
Javabean 類:
public class Student {
String name;
int age;
{
System.out.println("開始建立物件了。");
}
public Student() {
System.out.println("空參構造");
}
public Student(String name, int age) {
System.out.println("有參構造");
this.name = name;
this.age = age;
}
// 帶部分引數的構造方法
public Student(String name) {
System.out.println("帶部分引數的構造方法");
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
測試類:
public class Test {
public static void main(String[] args) {
Student s = new Student();
Student s1 = new Student("xiaoming", 23);
Student s2 = new Student("xiaoming");
}
}
執行結果:
開始建立物件了。
空參構造
開始建立物件了。
有參構造
開始建立物件了。
帶部分引數的構造方法
解決方案:將多個構造方法的重複的程式碼寫在其中一個構造方法中,在別的構造方法中,用 this 呼叫這個寫了重複語句的構造方法。
例如:
上圖中,由於不知道應該給 name 和 age 賦值多少,因為是空參構造,所以 this 方法中傳遞的實參就是預設初始化的值,即 string 型別給 null,age 型別給 0。
另一種方法:將重複的程式碼抽取成一個方法,在構造方法中呼叫這個方法即可。例如:
如此一來,構造程式碼塊也就不需要用了,只要見到了能認出來用到了構造程式碼塊這個方法就行了。
靜態程式碼塊
靜態程式碼塊需要加上 static 進行修飾。就是在區域性程式碼塊前面加 static,形式為:static {}
靜態程式碼塊是重點,需要掌握,以後會用到。
靜態程式碼塊的特點是用 static 關鍵字進行修飾,隨著類的載入而載入,並且自動觸發,只執行一次。
構造程式碼塊是每一次建立物件都會執行一次。但是靜態程式碼塊只執行一次。當這個類的程式碼載入到記憶體中時,靜態程式碼塊裡面的程式碼就會自動執行一次。
靜態程式碼塊的使用場景:在類載入的時候,做一些資料初始化的時候使用。
Javabean 類:
public class Student {
String name;
int age;
static {
System.out.println("執行靜態程式碼塊");
}
public Student() {
System.out.println("執行空參構造方法");
}
public Student(String name, int age) {
System.out.println("執行帶全部引數的構造方法");
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
測試類:
public class Test {
public static void main(String[] args) {
Student s1 = new Student();
Student s2 = new Student("xiaoming", 23);
}
}
執行結果:
執行靜態程式碼塊
執行空參構造方法
執行帶全部引數的構造方法
應用場景:例如資料的初始化,比如學生管理系統,每一次開始都是空的,都要先新增學生資訊,可以用靜態程式碼塊的方式使得程式在剛開始執行時就有一些初始化的資料。
靜態程式碼塊裡面只能呼叫靜態的方法或變數,即 static {}
裡面只能用被 static 修飾的方法或變數。