1-4-2 Java面向物件--static和程式碼塊
static
靜態成員和非靜態成員
靜態成員
靜態成員是屬於整個類的,由類所進行維護,僅在類初次載入時會被初始化,在類銷燬時回收。
通過該類例項化的所有物件都共享類中靜態資源,任一物件中資訊的修訂都將影響所有物件。
由於靜態成員在類載入期間就已經完成初始化,儲存在Java Heap(JDK7.0之前儲存在方法區)中靜態儲存區,因此優先於物件而存在,可以通過類名和物件名兩種方式訪問。
非靜態成員
非靜態成員屬於物件獨有,每個物件進行例項化時產生各自的成員,隨著物件的回收而釋放。
物件對各自成員資訊的修訂不影響其他物件
只能通過物件名訪問。
注意:
類外可應用“類名.成員名”或“物件名.成員名”的方式訪問非私有靜態成員,更推薦用“類名.成員名”體現其特性。應用“物件名.成員名”時會出現警告,但不影響程式執行。
靜態方法和非靜態方法
靜態方法:用static修飾的成員方法,通常也稱為靜態方法、類方法、全域性方法等。
非靜態方法:沒有被static修飾的成員方法,也稱為叫做非靜態方法、例項方法,物件方法等。
特徵
與靜態成員相似,靜態方法屬於整個類的,由類所進行維護,優先於物件而存在,因此可以通過類名和物件名兩種方式訪問,也因此在靜態方法中無法直接訪問同類中的非靜態成員。
總結
靜態方法中不能直接訪問同一個類的非靜態成員,只能呼叫同一個類靜態成員.
靜態方法不能使用this.
靜態程式碼塊
概念
靜態程式碼塊:被static修飾的,定義在類內部,用{}括起的程式碼段。
構造程式碼塊:沒有被static修飾的,定義在類內部,用{}括起的程式碼段。
普通程式碼塊:定義在方法內部,用{}括起的程式碼段。
特徵
靜態程式碼塊:
只能出現在類內,不允許出現在方法內。
可以出現多次,按順序在類載入時執行。
無論該類例項化多少物件,只執行一次。
構造程式碼塊:
可以在類內出現多次,按順序在每個物件例項化時執行。
執行優先順序:晚於靜態程式碼塊,高於構造方法。
每次執行物件例項化時,均會執行一次。
普通程式碼塊:
應用
靜態程式碼塊:基於效能優化的考量,多適用於需要在專案啟動時執行一次的場景,譬如專案資源整體載入等。
構造程式碼塊:多適用於類中每個物件產生時都需要執行的功能封裝。與構造方法的區別在於,構造方法是在new執行時有選擇性的呼叫帶參或者無參構造,而構造程式碼塊則是,在每個物件例項化時都一定會執行。
普通程式碼塊:適用於在方法內進行程式碼功能拆分。
1 public class Car { 2 static String field; 3 4 static { 5 field = "欄位1"; 6 System.out.println("我是靜態程式碼塊1"); 7 } 8 9 static { 10 field = "欄位2"; 11 System.out.println("我是靜態程式碼塊2"); 12 } 13 14 { 15 field = "欄位3"; 16 System.out.println("我是構造程式碼塊1"); 17 } 18 19 { 20 field = "欄位4"; 21 System.out.println("我是構造程式碼塊2"); 22 } 23 24 public Car() { 25 System.out.println("我是構造方法"); 26 } 27 28 public void show() { 29 System.out.println("欄位show:" + field); 30 } 31 32 }
1 public class CarTest { 2 3 public static void main(String[] args) { 4 Car one = new Car(); 5 one.show(); 6 System.out.println("******************************"); 7 Car two = new Car(); 8 two.show(); 9 //我是靜態程式碼塊1 10 //我是靜態程式碼塊2 11 //我是構造程式碼塊1 12 //我是構造程式碼塊2 13 //我是構造方法 14 //欄位show:欄位4 15 //****************************** 16 //我是構造程式碼塊1 17 //我是構造程式碼塊2 18 //我是構造方法 19 //欄位show:欄位4 20 } 21 }